h264: skip start code search if the size of the nal unit is known
authorJanne Grunau <janne-libav@jannau.net>
Sun, 18 Dec 2011 21:42:36 +0000 (22:42 +0100)
committerJanne Grunau <janne-libav@jannau.net>
Sun, 18 Dec 2011 22:52:53 +0000 (23:52 +0100)
Start code emulation prevention is only required in Annex B bytestream
packed NAL units. For other coding formats the size is already known.
Looking for a start code prefix can result in false positives like in
http://streams.videolan.org/streams/mp4/Mr_MrsSmith-h264_aac.mp4
which has a false positive in the SPS.

libavcodec/h264.c
libavcodec/h264.h
libavcodec/h264_parser.c

index 77acd71..5d4ce90 100644 (file)
@@ -137,7 +137,10 @@ int ff_h264_check_intra_pred_mode(H264Context *h, int mode){
     return mode;
 }
 
-const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src, int *dst_length, int *consumed, int length){
+const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src,
+                                  int *dst_length, int *consumed, int length,
+                                  int nalsize_known)
+{
     int i, si, di;
     uint8_t *dst;
     int bufidx;
@@ -148,6 +151,9 @@ const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src, int *dst_l
 
     src++; length--;
 
+    if (nalsize_known) {
+        i = length;
+    } else
 #if HAVE_FAST_UNALIGNED
 # if HAVE_FAST_64BIT
 #   define RS 7
@@ -3789,7 +3795,8 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){
 
         hx = h->thread_context[context_count];
 
-        ptr= ff_h264_decode_nal(hx, buf + buf_index, &dst_length, &consumed, next_avc - buf_index);
+        ptr= ff_h264_decode_nal(hx, buf + buf_index, &dst_length, &consumed,
+                                next_avc - buf_index, !!nalsize);
         if (ptr==NULL || dst_length < 0){
             return -1;
         }
index 5025538..24da4f5 100644 (file)
@@ -610,9 +610,12 @@ int ff_h264_decode_picture_parameter_set(H264Context *h, int bit_length);
  * @param consumed is the number of bytes used as input
  * @param length is the length of the array
  * @param dst_length is the number of decoded bytes FIXME here or a decode rbsp tailing?
+ * @param nalsize_known skip start code search if the size of the nalu is known
  * @return decoded bytes, might be src+1 if no escapes
  */
-const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src, int *dst_length, int *consumed, int length);
+const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src,
+                                  int *dst_length, int *consumed, int length,
+                                  int nalsize_known);
 
 /**
  * Free any data that may have been allocated in the H264 context like SPS, PPS etc.
index 826c17a..1967efa 100644 (file)
@@ -144,7 +144,7 @@ static inline int parse_nal_units(AVCodecParserContext *s,
                 src_length = 20;
             break;
         }
-        ptr= ff_h264_decode_nal(h, buf, &dst_length, &consumed, src_length);
+        ptr= ff_h264_decode_nal(h, buf, &dst_length, &consumed, src_length, 0);
         if (ptr==NULL || dst_length < 0)
             break;