@ -6,6 +6,7 @@ import av
from collections import OrderedDict
from collections import OrderedDict
import hashlib
import hashlib
import os
import os
from cvat . apps . engine . utils import rotate_image
class WorkWithVideo :
class WorkWithVideo :
def __init__ ( self , * * kwargs ) :
def __init__ ( self , * * kwargs ) :
@ -24,7 +25,6 @@ class WorkWithVideo:
video_stream . thread_type = ' AUTO '
video_stream . thread_type = ' AUTO '
return video_stream
return video_stream
class AnalyzeVideo ( WorkWithVideo ) :
class AnalyzeVideo ( WorkWithVideo ) :
def check_type_first_frame ( self ) :
def check_type_first_frame ( self ) :
container = self . _open_video_container ( self . source_path , mode = ' r ' )
container = self . _open_video_container ( self . source_path , mode = ' r ' )
@ -76,7 +76,17 @@ class PrepareInfo(WorkWithVideo):
@property
@property
def frame_sizes ( self ) :
def frame_sizes ( self ) :
container = self . _open_video_container ( self . source_path , ' r ' )
frame = next ( iter ( self . key_frames . values ( ) ) )
frame = next ( iter ( self . key_frames . values ( ) ) )
if container . streams . video [ 0 ] . metadata . get ( ' rotate ' ) :
frame = av . VideoFrame ( ) . from_ndarray (
rotate_image (
frame . to_ndarray ( format = ' bgr24 ' ) ,
360 - int ( container . streams . video [ 0 ] . metadata . get ( ' rotate ' ) )
) ,
format = ' bgr24 '
)
self . _close_video_container ( container )
return ( frame . width , frame . height )
return ( frame . width , frame . height )
def check_key_frame ( self , container , video_stream , key_frame ) :
def check_key_frame ( self , container , video_stream , key_frame ) :
@ -150,6 +160,14 @@ class PrepareInfo(WorkWithVideo):
if frame_number < start_chunk_frame_number :
if frame_number < start_chunk_frame_number :
continue
continue
elif frame_number < end_chunk_frame_number and not ( ( frame_number - start_chunk_frame_number ) % step ) :
elif frame_number < end_chunk_frame_number and not ( ( frame_number - start_chunk_frame_number ) % step ) :
if video_stream . metadata . get ( ' rotate ' ) :
frame = av . VideoFrame ( ) . from_ndarray (
rotate_image (
frame . to_ndarray ( format = ' bgr24 ' ) ,
360 - int ( container . streams . video [ 0 ] . metadata . get ( ' rotate ' ) )
) ,
format = ' bgr24 '
)
yield frame
yield frame
elif ( frame_number - start_chunk_frame_number ) % step :
elif ( frame_number - start_chunk_frame_number ) % step :
continue
continue
@ -177,6 +195,14 @@ class UploadedMeta(PrepareInfo):
container . seek ( offset = next ( iter ( self . key_frames . values ( ) ) ) , stream = video_stream )
container . seek ( offset = next ( iter ( self . key_frames . values ( ) ) ) , stream = video_stream )
for packet in container . demux ( video_stream ) :
for packet in container . demux ( video_stream ) :
for frame in packet . decode ( ) :
for frame in packet . decode ( ) :
if video_stream . metadata . get ( ' rotate ' ) :
frame = av . VideoFrame ( ) . from_ndarray (
rotate_image (
frame . to_ndarray ( format = ' bgr24 ' ) ,
360 - int ( container . streams . video [ 0 ] . metadata . get ( ' rotate ' ) )
) ,
format = ' bgr24 '
)
self . _close_video_container ( container )
self . _close_video_container ( container )
return ( frame . width , frame . height )
return ( frame . width , frame . height )