|
|
|
@ -68,23 +68,56 @@ AVCodecParserContext *av_parser_init(int codec_id) |
|
|
|
|
int av_parser_parse(AVCodecParserContext *s,
|
|
|
|
|
AVCodecContext *avctx, |
|
|
|
|
uint8_t **poutbuf, int *poutbuf_size,
|
|
|
|
|
const uint8_t *buf, int buf_size) |
|
|
|
|
const uint8_t *buf, int buf_size, |
|
|
|
|
int64_t pts, int64_t dts) |
|
|
|
|
{ |
|
|
|
|
int index; |
|
|
|
|
int index, i, k; |
|
|
|
|
uint8_t dummy_buf[FF_INPUT_BUFFER_PADDING_SIZE]; |
|
|
|
|
|
|
|
|
|
if (buf_size == 0) { |
|
|
|
|
/* padding is always necessary even if EOF, so we add it here */ |
|
|
|
|
memset(dummy_buf, 0, sizeof(dummy_buf)); |
|
|
|
|
buf = dummy_buf; |
|
|
|
|
} else { |
|
|
|
|
/* add a new packet descriptor */ |
|
|
|
|
k = (s->cur_frame_start_index + 1) & (AV_PARSER_PTS_NB - 1); |
|
|
|
|
s->cur_frame_start_index = k; |
|
|
|
|
s->cur_frame_offset[k] = s->cur_offset; |
|
|
|
|
s->cur_frame_pts[k] = pts; |
|
|
|
|
s->cur_frame_dts[k] = dts; |
|
|
|
|
|
|
|
|
|
/* fill first PTS/DTS */ |
|
|
|
|
if (s->cur_offset == 0) { |
|
|
|
|
s->last_pts = pts; |
|
|
|
|
s->last_dts = dts; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* WARNING: the returned index can be negative */ |
|
|
|
|
index = s->parser->parser_parse(s, avctx, poutbuf, poutbuf_size, buf, buf_size); |
|
|
|
|
/* update the file pointer */ |
|
|
|
|
if (*poutbuf_size) { |
|
|
|
|
/* fill the data for the current frame */ |
|
|
|
|
s->frame_offset = s->last_frame_offset; |
|
|
|
|
s->pts = s->last_pts; |
|
|
|
|
s->dts = s->last_dts; |
|
|
|
|
|
|
|
|
|
/* offset of the next frame */ |
|
|
|
|
s->last_frame_offset = s->cur_offset + index; |
|
|
|
|
/* find the packet in which the new frame starts. It
|
|
|
|
|
is tricky because of MPEG video start codes |
|
|
|
|
which can begin in one packet and finish in |
|
|
|
|
another packet. In the worst case, an MPEG |
|
|
|
|
video start code could be in 4 different |
|
|
|
|
packets. */ |
|
|
|
|
k = s->cur_frame_start_index; |
|
|
|
|
for(i = 0; i < AV_PARSER_PTS_NB; i++) { |
|
|
|
|
if (s->last_frame_offset >= s->cur_frame_offset[k]) |
|
|
|
|
break; |
|
|
|
|
k = (k - 1) & (AV_PARSER_PTS_NB - 1); |
|
|
|
|
} |
|
|
|
|
s->last_pts = s->cur_frame_pts[k]; |
|
|
|
|
s->last_dts = s->cur_frame_dts[k]; |
|
|
|
|
} |
|
|
|
|
if (index < 0) |
|
|
|
|
index = 0; |
|
|
|
|