[FFmpeg-cvslog] r17731 - in trunk/libavcodec: mpeg12.c mpegvideo.h mpegvideo_parser.c parser.c

michael subversion
Mon Mar 2 15:53:18 CET 2009


Author: michael
Date: Mon Mar  2 15:53:18 2009
New Revision: 17731

Log:
Call ff_fetch_timestamp() for mpeg1/2 when a picture start code is found instead
of calling it at the end of a frame with a large negative offset.
This significantly reduces the maximal distance in container packets between
the point where the first byte of the "access unit" was stored and where
we call ff_fetch_timestamp() thus reducing the constraints on our parser.
Also change the parser from next_frame_offset to cur, this is needed
because now the reference is from container packet start instead of
frame start. (i previously misinterpreted this as bug)

Modified:
   trunk/libavcodec/mpeg12.c
   trunk/libavcodec/mpegvideo.h
   trunk/libavcodec/mpegvideo_parser.c
   trunk/libavcodec/parser.c

Modified: trunk/libavcodec/mpeg12.c
==============================================================================
--- trunk/libavcodec/mpeg12.c	Mon Mar  2 10:33:57 2009	(r17730)
+++ trunk/libavcodec/mpeg12.c	Mon Mar  2 15:53:18 2009	(r17731)
@@ -2196,7 +2196,7 @@ static void mpeg_decode_gop(AVCodecConte
  * Finds the end of the current frame in the bitstream.
  * @return the position of the first byte of the next frame, or -1
  */
-int ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size)
+int ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size, AVCodecParserContext *s)
 {
     int i;
     uint32_t state= pc->state;
@@ -2244,6 +2244,9 @@ int ff_mpeg1_find_frame_end(ParseContext
                     return i-3;
                 }
             }
+            if(s && state == PICTURE_START_CODE){
+                ff_fetch_timestamp(s, i-4, 1);
+            }
         }
     }
     pc->state= state;
@@ -2276,7 +2279,7 @@ static int mpeg_decode_frame(AVCodecCont
     }
 
     if(s2->flags&CODEC_FLAG_TRUNCATED){
-        int next= ff_mpeg1_find_frame_end(&s2->parse_context, buf, buf_size);
+        int next= ff_mpeg1_find_frame_end(&s2->parse_context, buf, buf_size, NULL);
 
         if( ff_combine_frame(&s2->parse_context, next, (const uint8_t **)&buf, &buf_size) < 0 )
             return buf_size;

Modified: trunk/libavcodec/mpegvideo.h
==============================================================================
--- trunk/libavcodec/mpegvideo.h	Mon Mar  2 10:33:57 2009	(r17730)
+++ trunk/libavcodec/mpegvideo.h	Mon Mar  2 15:53:18 2009	(r17731)
@@ -769,7 +769,7 @@ void mpeg1_encode_mb(MpegEncContext *s,
 void ff_mpeg1_encode_init(MpegEncContext *s);
 void ff_mpeg1_encode_slice_header(MpegEncContext *s);
 void ff_mpeg1_clean_buffers(MpegEncContext *s);
-int ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size);
+int ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size, AVCodecParserContext *s);
 
 extern const uint8_t ff_mpeg4_y_dc_scale_table[32];
 extern const uint8_t ff_mpeg4_c_dc_scale_table[32];

Modified: trunk/libavcodec/mpegvideo_parser.c
==============================================================================
--- trunk/libavcodec/mpegvideo_parser.c	Mon Mar  2 10:33:57 2009	(r17730)
+++ trunk/libavcodec/mpegvideo_parser.c	Mon Mar  2 15:53:18 2009	(r17731)
@@ -29,7 +29,6 @@ static void mpegvideo_extract_headers(AV
 {
     ParseContext1 *pc = s->priv_data;
     const uint8_t *buf_end;
-    const uint8_t *buf_start= buf;
     uint32_t start_code;
     int frame_rate_index, ext_type, bytes_left;
     int frame_rate_ext_n, frame_rate_ext_d;
@@ -44,8 +43,6 @@ static void mpegvideo_extract_headers(AV
         bytes_left = buf_end - buf;
         switch(start_code) {
         case PICTURE_START_CODE:
-            ff_fetch_timestamp(s, buf-buf_start-4, 1);
-
             if (bytes_left >= 2) {
                 s->pict_type = (buf[1] >> 3) & 7;
             }
@@ -137,7 +134,7 @@ static int mpegvideo_parse(AVCodecParser
     if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){
         next= buf_size;
     }else{
-        next= ff_mpeg1_find_frame_end(pc, buf, buf_size);
+        next= ff_mpeg1_find_frame_end(pc, buf, buf_size, s);
 
         if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) {
             *poutbuf = NULL;

Modified: trunk/libavcodec/parser.c
==============================================================================
--- trunk/libavcodec/parser.c	Mon Mar  2 10:33:57 2009	(r17730)
+++ trunk/libavcodec/parser.c	Mon Mar  2 15:53:18 2009	(r17731)
@@ -87,7 +87,7 @@ void ff_fetch_timestamp(AVCodecParserCon
     s->dts= s->pts= AV_NOPTS_VALUE;
     s->offset= 0;
     for(i = 0; i < AV_PARSER_PTS_NB; i++) {
-        if (   s->next_frame_offset + off >= s->cur_frame_offset[i]
+        if (   s->cur_offset + off >= s->cur_frame_offset[i]
             &&(s->     frame_offset       <  s->cur_frame_offset[i] || !s->frame_offset)
             //check is disabled  becausue mpeg-ts doesnt send complete PES packets
             && /*s->next_frame_offset + off <*/  s->cur_frame_end[i]){




More information about the ffmpeg-cvslog mailing list