Browse code

use ff_avc_parse_nal_units_buf because output size might differ from input size

Originally committed as revision 16626 to svn://svn.ffmpeg.org/ffmpeg/trunk

Baptiste Coudurier authored on 2009/01/16 10:22:30
Showing 1 changed files
... ...
@@ -309,6 +309,7 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt)
309 309
     FLVContext *flv = s->priv_data;
310 310
     unsigned ts;
311 311
     int size= pkt->size;
312
+    uint8_t *data= NULL;
312 313
     int flags, flags_size;
313 314
 
314 315
 //    av_log(s, AV_LOG_DEBUG, "type:%d pts: %"PRId64" size:%d\n", enc->codec_type, timestamp, size);
... ...
@@ -341,6 +342,11 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt)
341 341
     }
342 342
 
343 343
     if (enc->codec_id == CODEC_ID_H264) {
344
+        /* check if extradata looks like mp4 formated */
345
+        if (enc->extradata_size > 0 && *(uint8_t*)enc->extradata != 1) {
346
+            if (ff_avc_parse_nal_units_buf(pkt->data, &data, &size) < 0)
347
+                return -1;
348
+        }
344 349
         if (!flv->delay && pkt->dts < 0)
345 350
             flv->delay = -pkt->dts;
346 351
     }
... ...
@@ -361,17 +367,16 @@ static int flv_write_packet(AVFormatContext *s, AVPacket *pkt)
361 361
         put_byte(pb,1); // AVC NALU
362 362
         put_be24(pb,pkt->pts - pkt->dts);
363 363
     }
364
-    if (enc->codec_id == CODEC_ID_H264 &&
365
-        /* check if extradata looks like mp4 formated */
366
-        enc->extradata_size > 0 && *(uint8_t*)enc->extradata != 1) {
367
-        ff_avc_parse_nal_units(pb, pkt->data, pkt->size);
368
-    } else {
369
-        put_buffer(pb, pkt->data, size);
370
-    }
364
+
365
+    put_buffer(pb, data ? data : pkt->data, size);
366
+
371 367
     put_be32(pb,size+flags_size+11); // previous tag size
372 368
     flv->duration = FFMAX(flv->duration, pkt->pts + flv->delay + pkt->duration);
373 369
 
374 370
     put_flush_packet(pb);
371
+
372
+    av_free(data);
373
+
375 374
     return 0;
376 375
 }
377 376