Mercurial > libavcodec.hg
comparison mpegvideo_parser.c @ 9090:cecf81f93756 libavcodec
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)
author | michael |
---|---|
date | Mon, 02 Mar 2009 14:53:18 +0000 |
parents | 8e5fe9e56b93 |
children | 9311c65558c0 |
comparison
equal
deleted
inserted
replaced
9089:bea68afbf199 | 9090:cecf81f93756 |
---|---|
27 AVCodecContext *avctx, | 27 AVCodecContext *avctx, |
28 const uint8_t *buf, int buf_size) | 28 const uint8_t *buf, int buf_size) |
29 { | 29 { |
30 ParseContext1 *pc = s->priv_data; | 30 ParseContext1 *pc = s->priv_data; |
31 const uint8_t *buf_end; | 31 const uint8_t *buf_end; |
32 const uint8_t *buf_start= buf; | |
33 uint32_t start_code; | 32 uint32_t start_code; |
34 int frame_rate_index, ext_type, bytes_left; | 33 int frame_rate_index, ext_type, bytes_left; |
35 int frame_rate_ext_n, frame_rate_ext_d; | 34 int frame_rate_ext_n, frame_rate_ext_d; |
36 int picture_structure, top_field_first, repeat_first_field, progressive_frame; | 35 int picture_structure, top_field_first, repeat_first_field, progressive_frame; |
37 int horiz_size_ext, vert_size_ext, bit_rate_ext; | 36 int horiz_size_ext, vert_size_ext, bit_rate_ext; |
42 start_code= -1; | 41 start_code= -1; |
43 buf= ff_find_start_code(buf, buf_end, &start_code); | 42 buf= ff_find_start_code(buf, buf_end, &start_code); |
44 bytes_left = buf_end - buf; | 43 bytes_left = buf_end - buf; |
45 switch(start_code) { | 44 switch(start_code) { |
46 case PICTURE_START_CODE: | 45 case PICTURE_START_CODE: |
47 ff_fetch_timestamp(s, buf-buf_start-4, 1); | |
48 | |
49 if (bytes_left >= 2) { | 46 if (bytes_left >= 2) { |
50 s->pict_type = (buf[1] >> 3) & 7; | 47 s->pict_type = (buf[1] >> 3) & 7; |
51 } | 48 } |
52 break; | 49 break; |
53 case SEQ_START_CODE: | 50 case SEQ_START_CODE: |
135 int next; | 132 int next; |
136 | 133 |
137 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){ | 134 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){ |
138 next= buf_size; | 135 next= buf_size; |
139 }else{ | 136 }else{ |
140 next= ff_mpeg1_find_frame_end(pc, buf, buf_size); | 137 next= ff_mpeg1_find_frame_end(pc, buf, buf_size, s); |
141 | 138 |
142 if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) { | 139 if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) { |
143 *poutbuf = NULL; | 140 *poutbuf = NULL; |
144 *poutbuf_size = 0; | 141 *poutbuf_size = 0; |
145 return buf_size; | 142 return buf_size; |