|
|
|
|
@ -10,9 +10,9 @@ from django.conf import settings
|
|
|
|
|
|
|
|
|
|
from cvat.apps.engine.media_extractors import (Mpeg4ChunkWriter,
|
|
|
|
|
Mpeg4CompressedChunkWriter, ZipChunkWriter, ZipCompressedChunkWriter)
|
|
|
|
|
from cvat.apps.engine.models import DataChoice
|
|
|
|
|
from cvat.apps.engine.models import DataChoice, UploadedDataStorageLocationChoice
|
|
|
|
|
from cvat.apps.engine.prepare import PrepareInfo
|
|
|
|
|
|
|
|
|
|
from .log import slogger
|
|
|
|
|
|
|
|
|
|
class CacheInteraction:
|
|
|
|
|
def __init__(self):
|
|
|
|
|
@ -31,28 +31,36 @@ class CacheInteraction:
|
|
|
|
|
|
|
|
|
|
def prepare_chunk_buff(self, db_data, quality, chunk_number):
|
|
|
|
|
from cvat.apps.engine.frame_provider import FrameProvider # TODO: remove circular dependency
|
|
|
|
|
extractor_classes = {
|
|
|
|
|
writer_classes = {
|
|
|
|
|
FrameProvider.Quality.COMPRESSED : Mpeg4CompressedChunkWriter if db_data.compressed_chunk_type == DataChoice.VIDEO else ZipCompressedChunkWriter,
|
|
|
|
|
FrameProvider.Quality.ORIGINAL : Mpeg4ChunkWriter if db_data.original_chunk_type == DataChoice.VIDEO else ZipChunkWriter,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
image_quality = 100 if extractor_classes[quality] in [Mpeg4ChunkWriter, ZipChunkWriter] else db_data.image_quality
|
|
|
|
|
mime_type = 'video/mp4' if extractor_classes[quality] in [Mpeg4ChunkWriter, Mpeg4CompressedChunkWriter] else 'application/zip'
|
|
|
|
|
image_quality = 100 if writer_classes[quality] in [Mpeg4ChunkWriter, ZipChunkWriter] else db_data.image_quality
|
|
|
|
|
mime_type = 'video/mp4' if writer_classes[quality] in [Mpeg4ChunkWriter, Mpeg4CompressedChunkWriter] else 'application/zip'
|
|
|
|
|
|
|
|
|
|
extractor = extractor_classes[quality](image_quality)
|
|
|
|
|
extractor = writer_classes[quality](image_quality)
|
|
|
|
|
|
|
|
|
|
images = []
|
|
|
|
|
buff = BytesIO()
|
|
|
|
|
if os.path.exists(db_data.get_meta_path()):
|
|
|
|
|
source_path = os.path.join(db_data.get_upload_dirname(), db_data.video.path)
|
|
|
|
|
meta = PrepareInfo(source_path=source_path, meta_path=db_data.get_meta_path())
|
|
|
|
|
for frame in meta.decode_needed_frames(chunk_number, db_data):
|
|
|
|
|
images.append(frame)
|
|
|
|
|
extractor.save_as_chunk([(image, source_path, None) for image in images], buff)
|
|
|
|
|
else:
|
|
|
|
|
with open(db_data.get_dummy_chunk_path(chunk_number), 'r') as dummy_file:
|
|
|
|
|
images = [os.path.join(db_data.get_upload_dirname(), line.strip()) for line in dummy_file]
|
|
|
|
|
extractor.save_as_chunk([(image, image, None) for image in images], buff)
|
|
|
|
|
upload_dir = {
|
|
|
|
|
UploadedDataStorageLocationChoice.LOCAL: db_data.get_upload_dirname(),
|
|
|
|
|
UploadedDataStorageLocationChoice.SHARE: settings.SHARE_ROOT
|
|
|
|
|
}[db_data.uploaded_data_storage_location]
|
|
|
|
|
try:
|
|
|
|
|
if os.path.exists(db_data.get_meta_path()):
|
|
|
|
|
source_path = os.path.join(upload_dir, db_data.video.path)
|
|
|
|
|
meta = PrepareInfo(source_path=source_path, meta_path=db_data.get_meta_path())
|
|
|
|
|
for frame in meta.decode_needed_frames(chunk_number, db_data):
|
|
|
|
|
images.append(frame)
|
|
|
|
|
extractor.save_as_chunk([(image, source_path, None) for image in images], buff)
|
|
|
|
|
else:
|
|
|
|
|
with open(db_data.get_dummy_chunk_path(chunk_number), 'r') as dummy_file:
|
|
|
|
|
images = [os.path.join(upload_dir, line.strip()) for line in dummy_file]
|
|
|
|
|
extractor.save_as_chunk([(image, image, None) for image in images], buff)
|
|
|
|
|
except FileNotFoundError as ex:
|
|
|
|
|
slogger.glob.exception(f"{ex.strerror} {ex.filename}")
|
|
|
|
|
|
|
|
|
|
buff.seek(0)
|
|
|
|
|
return buff, mime_type
|
|
|
|
|
|
|
|
|
|
|