]> granicus.if.org Git - handbrake/commitdiff
fixed drop frame issue
authorhandbrake <no-reply@handbrake.fr>
Fri, 22 Mar 2013 07:32:51 +0000 (07:32 +0000)
committerhandbrake <no-reply@handbrake.fr>
Fri, 22 Mar 2013 07:32:51 +0000 (07:32 +0000)
add a function to check input video pixel format

git-svn-id: svn://svn.handbrake.fr/HandBrake/branches/opencl@5355 b64f7644-9d1e-0410-96f1-a4d463321fa5

libhb/decavcodec.c
libhb/stream.c
libhb/vadxva2.c
libhb/vadxva2.h

index 54acc689f8f264a1a19963278563f130c76ecabd..5aa2c3912222498c9831aa0d880a398bad076329 100644 (file)
@@ -677,8 +677,7 @@ static hb_buffer_t *copy_frame( hb_work_private_t *pv, AVFrame *frame )
 
 #ifdef USE_HWD
 
-/* These methods are only used by HWD now. Can we remove this as per these changes: https://trac.handbrake.fr/changeset?reponame=&new=5323%40trunk%2Flibhb%2Fdecavcodec.c&old=5242%40trunk%2Flibhb%2Fdecavcodec.c */
-static int get_frame_buf( AVCodecContext *context, AVFrame *frame )
+static int get_frame_buf_hwd( AVCodecContext *context, AVFrame *frame )
 {
 
     hb_work_private_t *pv = (hb_work_private_t*)context->opaque;
@@ -692,12 +691,24 @@ static int get_frame_buf( AVCodecContext *context, AVFrame *frame )
         return 0;
     }
     else
-    return avcodec_default_get_buffer( context, frame );
+        return avcodec_default_get_buffer( context, frame );
 }
 
-static int reget_frame_buf( AVCodecContext *context, AVFrame *frame )
+static void hb_ffmpeg_release_frame_buf( struct AVCodecContext *p_context, AVFrame *frame )
 {
-    return avcodec_default_reget_buffer( context, frame );
+    hb_work_private_t *p_dec = (hb_work_private_t*)p_context->opaque;
+    int i;
+    if( p_dec->dxva2 )
+    {
+        hb_va_release( p_dec->dxva2, frame );
+    }
+    else if( !frame->opaque )
+    {
+        if( frame->type == FF_BUFFER_TYPE_INTERNAL )
+            avcodec_default_release_buffer( p_context, frame );
+    }
+    for( i = 0; i < 4; i++ )
+        frame->data[i] = NULL;
 }
 #endif
 
@@ -900,6 +911,7 @@ static int decodeFrame( hb_work_object_t *w, uint8_t *data, int size, int sequen
         if ( !pv->frame_duration_set )
             compute_frame_duration( pv );
 
+        double pts;
         double frame_dur = pv->duration;
         if ( frame.repeat_pict )
         {
@@ -915,11 +927,11 @@ static int decodeFrame( hb_work_object_t *w, uint8_t *data, int size, int sequen
                 else
                     frame.pkt_pts = pv->dxva2->input_pts[0]<pv->dxva2->input_pts[1] ? pv->dxva2->input_pts[0] : pv->dxva2->input_pts[1];
             }
+            pts = pv->pts_next;
         }
-#endif
+#else
         // If there was no pts for this frame, assume constant frame rate
         // video & estimate the next frame time from the last & duration.
-        double pts;
         if (frame.pkt_pts == AV_NOPTS_VALUE)
         {
             pts = pv->pts_next;
@@ -928,6 +940,7 @@ static int decodeFrame( hb_work_object_t *w, uint8_t *data, int size, int sequen
         {
             pts = frame.pkt_pts;
         }
+#endif
         pv->pts_next = pts + frame_dur;
 
         if ( frame.top_field_first )
@@ -1102,37 +1115,6 @@ static hb_buffer_t *link_buf_list( hb_work_private_t *pv )
     }
     return head;
 }
-#ifdef USE_HWD
-static void hb_ffmpeg_release_frame_buf( struct AVCodecContext *p_context, AVFrame *frame )
-{
-    hb_work_private_t *p_dec = (hb_work_private_t*)p_context->opaque;
-    int i;
-    if( p_dec->dxva2 )
-    {
-        hb_va_release( p_dec->dxva2, frame );
-    }
-    else if( !frame->opaque )
-    {
-        if( frame->type == FF_BUFFER_TYPE_INTERNAL )
-            avcodec_default_release_buffer( p_context, frame );
-    }
-    for( i = 0; i < 4; i++ )
-        frame->data[i] = NULL;
-}
-
-/* This is only used by HWD now. Can we remove this as per these changes: https://trac.handbrake.fr/changeset?reponame=&new=5323%40trunk%2Flibhb%2Fdecavcodec.c&old=5242%40trunk%2Flibhb%2Fdecavcodec.c */
-static void init_video_avcodec_context( hb_work_private_t *pv )
-{
-    /* we have to wrap ffmpeg's get_buffer to be able to set the pts (?!) */
-    pv->context->opaque = pv;
-    pv->context->get_buffer = get_frame_buf;
-    pv->context->reget_buffer = reget_frame_buf;
-
-    if( pv->dxva2 && pv->dxva2->do_job==HB_WORK_OK )
-        pv->context->release_buffer = hb_ffmpeg_release_frame_buf;
-}
-#endif
-
 
 static int decavcodecvInit( hb_work_object_t * w, hb_job_t * job )
 {
@@ -1173,7 +1155,9 @@ static int decavcodecvInit( hb_work_object_t * w, hb_job_t * job )
             if( pv->dxva2 && pv->dxva2->do_job==HB_WORK_OK )
             {
                 hb_va_new_dxva2( pv->dxva2, pv->context );
-                init_video_avcodec_context( pv );
+                pv->context->opaque = pv;
+                pv->context->get_buffer = get_frame_buf_hwd;
+                pv->context->release_buffer = hb_ffmpeg_release_frame_buf;
                 pv->context->get_format = hb_ffmpeg_get_format;
                 pv->os = ( hb_oclscale_t * )malloc( sizeof( hb_oclscale_t ) );
                 memset( pv->os, 0, sizeof( hb_oclscale_t ) );
index b122bcf7724d9332bdfdafbab382a5d2c8ec73d2..75a2da181df006676fce1ba50a6ee49de09fd495 100644 (file)
@@ -5561,6 +5561,7 @@ static hb_title_t *ffmpeg_title_scan( hb_stream_t *stream, hb_title_t *title )
     title->demuxer = HB_NULL_DEMUXER;
     title->video_codec = 0;
     int i;
+    int pix_fmt = -1;
     for (i = 0; i < ic->nb_streams; ++i )
     {
         if ( ic->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
@@ -5568,6 +5569,7 @@ static hb_title_t *ffmpeg_title_scan( hb_stream_t *stream, hb_title_t *title )
              title->video_codec == 0 )
         {
             AVCodecContext *context = ic->streams[i]->codec;
+            pix_fmt = context->pix_fmt;
             if ( context->pix_fmt != AV_PIX_FMT_YUV420P &&
                  !sws_isSupportedInput( context->pix_fmt ) )
             {
@@ -5685,6 +5687,8 @@ static hb_title_t *ffmpeg_title_scan( hb_stream_t *stream, hb_title_t *title )
     }
     else
         title->hwd_support = 0;
+   if ( hb_check_hwd_fmt(pix_fmt) == 0)
+       title->hwd_support = 0;
 #else
     title->hwd_support = 0;
 #endif
index 2b3bc5fc1e6aa66569ddd505c66da749e3a29b3d..369f51b48f4b22bda460533c50052cfa9734d7ab 100644 (file)
@@ -792,4 +792,46 @@ int hb_va_get_frame_buf( hb_va_dxva2_t *dxva2, AVCodecContext *p_context, AVFram
     return HB_WORK_OK;
 
 }
+
+int hb_check_hwd_fmt( int fmt )
+{
+    int result = 1;
+    switch ( fmt )
+    {
+        case AV_PIX_FMT_YUV420P16LE:
+        case AV_PIX_FMT_YUV420P16BE:
+        case AV_PIX_FMT_YUV422P16LE:
+        case AV_PIX_FMT_YUV422P16BE:
+        case AV_PIX_FMT_YUV444P16LE:
+        case AV_PIX_FMT_YUV444P16BE:
+        case AV_PIX_FMT_YUV420P9BE:
+        case AV_PIX_FMT_YUV420P9LE:
+        case AV_PIX_FMT_YUV420P10BE:
+        case AV_PIX_FMT_YUV420P10LE:
+        case AV_PIX_FMT_YUV422P10BE:
+        case AV_PIX_FMT_YUV422P10LE:
+        case AV_PIX_FMT_YUV444P9BE:
+        case AV_PIX_FMT_YUV444P9LE:
+        case AV_PIX_FMT_YUV444P10BE:
+        case AV_PIX_FMT_YUV444P10LE:
+        case AV_PIX_FMT_YUV422P9BE:
+        case AV_PIX_FMT_YUV422P9LE:
+        case AV_PIX_FMT_GBRP9BE:
+        case AV_PIX_FMT_GBRP9LE:
+        case AV_PIX_FMT_GBRP10BE:
+        case AV_PIX_FMT_GBRP10LE:
+        case AV_PIX_FMT_GBRP16BE:
+        case AV_PIX_FMT_GBRP16LE:
+        case AV_PIX_FMT_YUVA420P9BE:
+        case AV_PIX_FMT_YUVA420P9LE:
+        case AV_PIX_FMT_YUVA422P9BE:
+        case AV_PIX_FMT_YUVA422P9LE:
+        case AV_PIX_FMT_YUVA444P9BE:
+        case AV_PIX_FMT_YUVA444P9LE:
+        case AV_PIX_FMT_YUVA420P10BE:
+        case AV_PIX_FMT_YUVA420P10LE:
+             result = 0; 
+    }
+    return result;
+}
 #endif
index 63251543bead634547cfa02b8126333fe379fc55..d95a50d91e5cafcd4c05468ecab1aa84b824cbac 100644 (file)
@@ -208,6 +208,6 @@ hb_va_dxva2_t *hb_va_create_dxva2( hb_va_dxva2_t *dxva2, int codec_id );
 void hb_va_new_dxva2( hb_va_dxva2_t *dxva2, AVCodecContext *p_context );
 void hb_va_release( hb_va_dxva2_t *dxva2, AVFrame *frame );
 void  hb_va_close( hb_va_dxva2_t *dxva2 );
-
+int hb_check_hwd_fmt( int fmt );
 #endif
 #endif