diff --git a/libavformat/avidec.c b/libavformat/avidec.c index 5d3bb8ac18..dbfef1db38 100644 --- a/libavformat/avidec.c +++ b/libavformat/avidec.c @@ -296,9 +296,17 @@ static int avi_read_packet(AVFormatContext *s, AVPacket *pkt) int n, d[8], size, i; memset(d, -1, sizeof(int)*8); - - if (avi->type == 1 && avi->stream_index) - goto pkt_init; + + if (avi->type == 1 && avi->stream_index) { + /* duplicate DV packet */ + av_init_packet(pkt); + pkt->data = avi->buf; + pkt->size = avi->buf_size; + pkt->destruct = __destruct_pkt; + pkt->stream_index = avi->stream_index; + avi->stream_index = !avi->stream_index; + return 0; + } for(i=url_ftell(pb); !url_feof(pb); i++) { int j; @@ -346,31 +354,29 @@ static int avi_read_packet(AVFormatContext *s, AVPacket *pkt) && n < s->nb_streams && i + size <= avi->movi_end) { - uint8_t *tbuf = av_realloc(avi->buf, size + FF_INPUT_BUFFER_PADDING_SIZE); - if (!tbuf) - return -1; - avi->buf = tbuf; - avi->buf_size = size; - get_buffer(pb, avi->buf, size); - if (size & 1) - get_byte(pb); - if (avi->type != 1) - avi->stream_index = n; - goto pkt_init; + if (avi->type == 1) { + uint8_t *tbuf = av_realloc(avi->buf, size + FF_INPUT_BUFFER_PADDING_SIZE); + if (!tbuf) + return -1; + avi->buf = tbuf; + avi->buf_size = size; + av_init_packet(pkt); + pkt->data = avi->buf; + pkt->size = avi->buf_size; + pkt->destruct = __destruct_pkt; + avi->stream_index = n; + } else { + av_new_packet(pkt, size); + } + get_buffer(pb, pkt->data, size); + if (size & 1) + get_byte(pb); + pkt->stream_index = n; + pkt->flags |= PKT_FLAG_KEY; // FIXME: We really should read index for that + return 0; } } - return -1; - -pkt_init: - av_init_packet(pkt); - pkt->data = avi->buf; - pkt->size = avi->buf_size; - pkt->destruct = __destruct_pkt; - pkt->stream_index = avi->stream_index; - pkt->flags |= PKT_FLAG_KEY; // FIXME: We really should read index for that - avi->stream_index = !avi->stream_index; - return 0; } static int avi_read_close(AVFormatContext *s)