]> granicus.if.org Git - handbrake/commitdiff
libhb: use the new keyframe flag.
authorTim Walker <tdskywalker@gmail.com>
Sat, 17 Sep 2016 13:45:38 +0000 (15:45 +0200)
committerTim Walker <tdskywalker@gmail.com>
Sat, 17 Sep 2016 13:45:38 +0000 (15:45 +0200)
libhb/decavcodec.c
libhb/encavcodec.c
libhb/enctheora.c
libhb/encx264.c
libhb/encx265.c
libhb/muxavformat.c
libhb/qsv_common.c
libhb/stream.c

index eef1059df6cc187934283dc8d996faa54b6e570c..ea0cad60d2be41597f5cabae52ee7f9e8dec3160 100644 (file)
@@ -957,16 +957,22 @@ static hb_buffer_t * cc_fill_buffer(hb_work_private_t *pv, uint8_t *cc, int size
 
 static int get_frame_type(int type)
 {
-    switch(type)
+    switch (type)
     {
-        case AV_PICTURE_TYPE_I:
-            return HB_FRAME_I;
         case AV_PICTURE_TYPE_B:
             return HB_FRAME_B;
+
+        case AV_PICTURE_TYPE_S:
         case AV_PICTURE_TYPE_P:
+        case AV_PICTURE_TYPE_SP:
             return HB_FRAME_P;
+
+        case AV_PICTURE_TYPE_BI:
+        case AV_PICTURE_TYPE_SI:
+        case AV_PICTURE_TYPE_I:
+        default:
+            return HB_FRAME_I;
     }
-    return 0;
 }
 
 /*
index b5cee5c816787b8251b90c1ef2b5052300b4a870..b17dd10ed0c862db4fae1ff513f050510bc8adb9 100644 (file)
@@ -443,58 +443,36 @@ static void compute_dts_offset( hb_work_private_t * pv, hb_buffer_t * buf )
 
 static uint8_t convert_pict_type( int pict_type, char pkt_flag_key, uint16_t* sflags )
 {
+    uint16_t flags = 0;
     uint8_t retval = 0;
-    switch ( pict_type )
+    switch (pict_type)
     {
-        case AV_PICTURE_TYPE_P:
-        {
-            retval = HB_FRAME_P;
-        } break;
-
         case AV_PICTURE_TYPE_B:
-        {
             retval = HB_FRAME_B;
-        } break;
+            break;
 
         case AV_PICTURE_TYPE_S:
-        {
-            retval = HB_FRAME_P;
-        } break;
-
+        case AV_PICTURE_TYPE_P:
         case AV_PICTURE_TYPE_SP:
-        {
             retval = HB_FRAME_P;
-        } break;
+            break;
+
 
         case AV_PICTURE_TYPE_BI:
         case AV_PICTURE_TYPE_SI:
         case AV_PICTURE_TYPE_I:
-        {
-            *sflags |= HB_FRAME_REF;
-            if ( pkt_flag_key )
-            {
-                retval = HB_FRAME_IDR;
-            }
-            else
-            {
-                retval = HB_FRAME_I;
-            }
-        } break;
-
         default:
         {
-            if ( pkt_flag_key )
-            {
-                //buf->s.flags |= HB_FRAME_REF;
-                *sflags |= HB_FRAME_REF;
-                retval = HB_FRAME_KEY;
-            }
-            else
-            {
-                retval = HB_FRAME_REF;
-            }
+            flags |= HB_FLAG_FRAMETYPE_REF;
+            retval = HB_FRAME_I;
         } break;
     }
+    if (pkt_flag_key)
+    {
+        flags |= HB_FLAG_FRAMETYPE_REF;
+        flags |= HB_FLAG_FRAMETYPE_KEY;
+    }
+    *sflags = flags;
     return retval;
 }
 
@@ -639,9 +617,8 @@ int encavcodecWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
                 buf->s.start    = get_frame_start( pv, frameno );
                 buf->s.duration = get_frame_duration( pv, frameno );
                 buf->s.stop     = buf->s.stop + buf->s.duration;
-                buf->s.flags   &= ~HB_FRAME_REF;
                 buf->s.frametype = convert_pict_type( pv->context->coded_frame->pict_type, pkt.flags & AV_PKT_FLAG_KEY, &buf->s.flags );
-                if (buf->s.frametype & HB_FRAME_KEY)
+                if (buf->s.flags & HB_FLAG_FRAMETYPE_KEY)
                 {
                     hb_chapter_dequeue(pv->chapter_queue, buf);
                 }
index 12438058febf39305e517efc564d496bd2066bf1..f721269b5abe50998dfb840c25f63385e2528907 100644 (file)
@@ -358,7 +358,12 @@ int enctheoraWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
     buf->f.fmt = AV_PIX_FMT_YUV420P;
     buf->f.width = frame_width;
     buf->f.height = frame_height;
-    buf->s.frametype = ( th_packet_iskeyframe(&op) ) ? HB_FRAME_KEY : HB_FRAME_REF;
+    buf->s.flags = HB_FLAG_FRAMETYPE_REF;
+    buf->s.frametype = HB_FRAME_I;
+    if (th_packet_iskeyframe(&op))
+    {
+        buf->s.flags |= HB_FLAG_FRAMETYPE_KEY;
+    }
     buf->s.start    = in->s.start;
     buf->s.stop     = in->s.stop;
     buf->s.duration = in->s.stop - in->s.start;
index e74e4a39dca72041f4a2f0b25b28f2bc790a7f8b..d5adfdd105c7e055be2aa7661d227a56220eb932 100644 (file)
@@ -652,15 +652,11 @@ static hb_buffer_t *nal_encode( hb_work_object_t *w, x264_picture_t *pic_out,
         w->config->h264.init_delay = -pic_out->i_dts;
     }
 
-    /* Decide what type of frame we have. */
-    switch( pic_out->i_type )
+    /* Determine what type of frame we have. */
+    switch (pic_out->i_type)
     {
         case X264_TYPE_IDR:
-            // Handled in b_keyframe check below.
-            break;
-
-        case X264_TYPE_I:
-            buf->s.frametype = HB_FRAME_I;
+            buf->s.frametype = HB_FRAME_IDR;
             break;
 
         case X264_TYPE_P:
@@ -671,24 +667,20 @@ static hb_buffer_t *nal_encode( hb_work_object_t *w, x264_picture_t *pic_out,
             buf->s.frametype = HB_FRAME_B;
             break;
 
-    /*  This is for b-pyramid, which has reference b-frames
-        However, it doesn't seem to ever be used... */
         case X264_TYPE_BREF:
             buf->s.frametype = HB_FRAME_BREF;
             break;
 
-        // If it isn't the above, what type of frame is it??
+        case X264_TYPE_I:
         default:
-            buf->s.frametype = 0;
+            buf->s.frametype = HB_FRAME_I;
             break;
     }
+    buf->s.flags = 0;
 
-    // PIR has no IDR frames, but x264 marks recovery points
-    // as keyframes.  So fake an IDR at these points. This flag
-    // is also set for real IDR frames.
     if (pic_out->b_keyframe)
     {
-        buf->s.frametype = HB_FRAME_IDR;
+        buf->s.flags |= HB_FLAG_FRAMETYPE_KEY;
         /* if we have a chapter marker pending and this
            frame's presentation time stamp is at or after
            the marker's time stamp, use this as the
@@ -728,17 +720,24 @@ static hb_buffer_t *nal_encode( hb_work_object_t *w, x264_picture_t *pic_out,
                 break;
         }
 
-        /* Since libx264 doesn't tell us when b-frames are
-           themselves reference frames, figure it out on our own. */
-        if( (buf->s.frametype == HB_FRAME_B) &&
-            (nal[i].i_ref_idc != NAL_PRIORITY_DISPOSABLE) )
-            buf->s.frametype = HB_FRAME_BREF;
-
-        /* Expose disposable bit to muxer. */
-        if( nal[i].i_ref_idc == NAL_PRIORITY_DISPOSABLE )
-            buf->s.flags &= ~HB_FRAME_REF;
+        /*
+         * Expose disposable bit to muxer.
+         *
+         * Also, since libx264 doesn't tell us when B-frames are
+         * themselves reference frames, figure it out on our own.
+         */
+        if (nal[i].i_ref_idc == NAL_PRIORITY_DISPOSABLE)
+        {
+            buf->s.flags &= ~HB_FLAG_FRAMETYPE_REF;
+        }
         else
-            buf->s.flags |= HB_FRAME_REF;
+        {
+            if (buf->s.frametype == HB_FRAME_B)
+            {
+                buf->s.frametype  = HB_FRAME_BREF;
+            }
+            buf->s.flags |= HB_FLAG_FRAMETYPE_REF;
+        }
 
         buf->size += size;
     }
index eaf131d0b86212e56868673b761a7c5707f9cd55..9cb23bd086e8edf91e493654e40cf800abb9b007 100644 (file)
@@ -384,8 +384,9 @@ static hb_buffer_t* nal_encode(hb_work_object_t *w,
     {
         return NULL;
     }
-
+    buf->s.flags = 0;
     buf->size = 0;
+
     // copy the bitstream data
     for (i = 0; i < nnal; i++)
     {
@@ -406,11 +407,10 @@ static hb_buffer_t* nal_encode(hb_work_object_t *w,
     switch (pic_out->sliceType)
     {
         case X265_TYPE_IDR:
+            buf->s.flags |= HB_FLAG_FRAMETYPE_REF;
+            buf->s.flags |= HB_FLAG_FRAMETYPE_KEY;
             buf->s.frametype = HB_FRAME_IDR;
             break;
-        case X265_TYPE_I:
-            buf->s.frametype = HB_FRAME_I;
-            break;
         case X265_TYPE_P:
             buf->s.frametype = HB_FRAME_P;
             break;
@@ -420,12 +420,13 @@ static hb_buffer_t* nal_encode(hb_work_object_t *w,
         case X265_TYPE_BREF:
             buf->s.frametype = HB_FRAME_BREF;
             break;
+        case X265_TYPE_I:
         default:
-            buf->s.frametype = 0;
+            buf->s.frametype = HB_FRAME_I;
             break;
     }
 
-    if (pic_out->sliceType == X265_TYPE_IDR)
+    if (buf->s.flags & HB_FLAG_FRAMETYPE_KEY)
     {
         hb_chapter_dequeue(pv->chapter_queue, buf);
     }
index 47762721c531a999d71756756f5490a1292e04dd..7b8bec67a6157e79c75712932ac2e6d58d0cddfa 100644 (file)
@@ -1161,12 +1161,13 @@ static int avformatMux(hb_mux_object_t *m, hb_mux_data_t *track, hb_buffer_t *bu
     pkt.pts = pts;
     pkt.duration = duration;
 
-    if (track->type == MUX_TYPE_VIDEO && ((job->vcodec & HB_VCODEC_H264_MASK) ||
-                                          (job->vcodec & HB_VCODEC_H265_MASK) ||
-                                          (job->vcodec & HB_VCODEC_FFMPEG_MASK)))
+    if (track->type == MUX_TYPE_VIDEO)
     {
-        if (buf->s.frametype == HB_FRAME_IDR)
+        if ((buf->s.frametype == HB_FRAME_IDR) ||
+            (buf->s.flags & HB_FLAG_FRAMETYPE_KEY))
+        {
             pkt.flags |= AV_PKT_FLAG_KEY;
+        }
     }
     else if (buf->s.frametype & HB_FRAME_KEY)
     {
index 08d7f9c592f06b0212025f7b358057dcbd9d5c0a..bb5dbc15a95e523adf32ce5bdd629216f0e9c32e 100644 (file)
@@ -2039,8 +2039,9 @@ uint8_t hb_qsv_frametype_xlat(uint16_t qsv_frametype, uint16_t *out_flags)
     uint16_t flags     = 0;
     uint8_t  frametype = 0;
 
-    if      (qsv_frametype & MFX_FRAMETYPE_IDR)
+    if (qsv_frametype & MFX_FRAMETYPE_IDR)
     {
+        flags |= HB_FLAG_FRAMETYPE_KEY;
         frametype = HB_FRAME_IDR;
     }
     else if (qsv_frametype & MFX_FRAMETYPE_I)
@@ -2058,7 +2059,7 @@ uint8_t hb_qsv_frametype_xlat(uint16_t qsv_frametype, uint16_t *out_flags)
 
     if (qsv_frametype & MFX_FRAMETYPE_REF)
     {
-        flags |= HB_FRAME_REF;
+        flags |= HB_FLAG_FRAMETYPE_REF;
     }
 
     if (out_flags != NULL)
index f5a6cb7df0fff6eca70d910ec9124b8b66d0b080..2cdd4503db6b53f4a49805648e639e795a05d06a 100644 (file)
@@ -5802,9 +5802,10 @@ hb_buffer_t * hb_ffmpeg_read( hb_stream_t *stream )
              * libav avcodec_decode_video2() needs AVPacket flagged with AV_PKT_FLAG_KEY
              * for some codecs. For example, sequence of PNG in a mov container.
              */
-            if ( stream->ffmpeg_pkt->flags & AV_PKT_FLAG_KEY )
+            if (stream->ffmpeg_pkt->flags & AV_PKT_FLAG_KEY)
             {
-                buf->s.frametype |= HB_FRAME_KEY;
+                buf->s.flags = HB_FLAG_FRAMETYPE_KEY;
+                buf->s.frametype = HB_FRAME_I;
             }
             break;