mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
mpeg12: move current_picture_ptr reset to the end of decode_frame.
This fixes passing fields instead of frames into the decoder. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
e3d95b54db
commit
0af7ccd9e2
@ -2522,14 +2522,13 @@ static int mpeg_decode_frame(AVCodecContext *avctx,
|
|||||||
AVPacket *avpkt)
|
AVPacket *avpkt)
|
||||||
{
|
{
|
||||||
const uint8_t *buf = avpkt->data;
|
const uint8_t *buf = avpkt->data;
|
||||||
|
int ret;
|
||||||
int buf_size = avpkt->size;
|
int buf_size = avpkt->size;
|
||||||
Mpeg1Context *s = avctx->priv_data;
|
Mpeg1Context *s = avctx->priv_data;
|
||||||
AVFrame *picture = data;
|
AVFrame *picture = data;
|
||||||
MpegEncContext *s2 = &s->mpeg_enc_ctx;
|
MpegEncContext *s2 = &s->mpeg_enc_ctx;
|
||||||
av_dlog(avctx, "fill_buffer\n");
|
av_dlog(avctx, "fill_buffer\n");
|
||||||
|
|
||||||
s2->current_picture_ptr = NULL;
|
|
||||||
|
|
||||||
if (buf_size == 0 || (buf_size == 4 && AV_RB32(buf) == SEQ_END_CODE)) {
|
if (buf_size == 0 || (buf_size == 4 && AV_RB32(buf) == SEQ_END_CODE)) {
|
||||||
/* special case for last picture */
|
/* special case for last picture */
|
||||||
if (s2->low_delay == 0 && s2->next_picture_ptr) {
|
if (s2->low_delay == 0 && s2->next_picture_ptr) {
|
||||||
@ -2557,17 +2556,23 @@ static int mpeg_decode_frame(AVCodecContext *avctx,
|
|||||||
s->slice_count = 0;
|
s->slice_count = 0;
|
||||||
|
|
||||||
if (avctx->extradata && !s->parsed_extra) {
|
if (avctx->extradata && !s->parsed_extra) {
|
||||||
int ret = decode_chunks(avctx, picture, got_output, avctx->extradata, avctx->extradata_size);
|
ret = decode_chunks(avctx, picture, got_output, avctx->extradata, avctx->extradata_size);
|
||||||
if(*got_output) {
|
if(*got_output) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "picture in extradata\n");
|
av_log(avctx, AV_LOG_ERROR, "picture in extradata\n");
|
||||||
*got_output = 0;
|
*got_output = 0;
|
||||||
}
|
}
|
||||||
s->parsed_extra = 1;
|
s->parsed_extra = 1;
|
||||||
if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE))
|
if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE)) {
|
||||||
|
s2->current_picture_ptr = NULL;
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return decode_chunks(avctx, picture, got_output, buf, buf_size);
|
ret = decode_chunks(avctx, picture, got_output, buf, buf_size);
|
||||||
|
if (ret<0 || *got_output)
|
||||||
|
s2->current_picture_ptr = NULL;
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user