check if current block contains a B frame and gives this info to parse_block()
authorAurelien Jacobs <aurel@gnuage.org>
Sun, 11 Mar 2007 23:05:01 +0000 (23:05 +0000)
committerAurelien Jacobs <aurel@gnuage.org>
Sun, 11 Mar 2007 23:05:01 +0000 (23:05 +0000)
Originally committed as revision 8332 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/matroska.c

index 3d6d9756900063af4fd66e0ddeefce71146f5b84..7b86bc670aee8412ce8e8ac14b6a83300bdde016 100644 (file)
@@ -2377,7 +2377,8 @@ rv_offset(uint8_t *data, int slice, int slices)
 static int
 matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, int size,
                      int64_t pos, uint64_t cluster_time,
-                     int is_keyframe, int *ptrack, AVPacket **ppkt)
+                     int is_keyframe, int is_bframe,
+                     int *ptrack, AVPacket **ppkt)
 {
     int res = 0;
     int track;
@@ -2558,6 +2559,7 @@ matroska_parse_blockgroup (MatroskaDemuxContext *matroska,
     int res = 0;
     uint32_t id;
     AVPacket *pkt = NULL;
+    int is_bframe = 0;
     int is_keyframe = PKT_FLAG_KEY, last_num_packets = matroska->num_packets;
     uint64_t duration = AV_NOPTS_VALUE;
     int track = -1;
@@ -2592,14 +2594,19 @@ matroska_parse_blockgroup (MatroskaDemuxContext *matroska,
                 break;
             }
 
-            case MATROSKA_ID_BLOCKREFERENCE:
+            case MATROSKA_ID_BLOCKREFERENCE: {
+                int64_t num;
                 /* We've found a reference, so not even the first frame in
                  * the lace is a key frame. */
                 is_keyframe = 0;
                 if (last_num_packets != matroska->num_packets)
                     matroska->packets[last_num_packets]->flags = 0;
-                res = ebml_read_skip(matroska);
+                if ((res = ebml_read_sint(matroska, &id, &num)) < 0)
+                    break;
+                if (num > 0)
+                    is_bframe = 1;
                 break;
+            }
 
             default:
                 av_log(matroska->ctx, AV_LOG_INFO,
@@ -2622,7 +2629,7 @@ matroska_parse_blockgroup (MatroskaDemuxContext *matroska,
 
     if (size > 0)
         res = matroska_parse_block(matroska, data, size, pos, cluster_time,
-                                   is_keyframe, &track, &pkt);
+                                   is_keyframe, is_bframe, &track, &pkt);
 
     if (pkt)
     {
@@ -2679,7 +2686,7 @@ matroska_parse_cluster (MatroskaDemuxContext *matroska)
                 res = ebml_read_binary(matroska, &id, &data, &size);
                 if (res == 0)
                     res = matroska_parse_block(matroska, data, size, pos,
-                                               cluster_time, -1, NULL, NULL);
+                                               cluster_time, -1,0, NULL, NULL);
                 break;
 
             default: