On 2011-12-19 23:55:31 -0500, Justin Ruggles wrote:
> This fixes demuxing of file where the first packet is not audio. Such files
> are generated by our idroq muxer. It also fixes demuxing of audio only
> idroq files.
> ---
> libavformat/idroqdec.c | 27 ++++++++++++++-------------
> 1 files changed, 14 insertions(+), 13 deletions(-)
>
> diff --git a/libavformat/idroqdec.c b/libavformat/idroqdec.c
> index 5e347b1..f763e71 100644
> --- a/libavformat/idroqdec.c
> +++ b/libavformat/idroqdec.c
> @@ -44,6 +44,7 @@
>
> typedef struct RoqDemuxContext {
>
> + int frame_rate;
> int width;
> int height;
> int audio_channels;
> @@ -70,29 +71,21 @@ static int roq_read_header(AVFormatContext *s,
> {
> RoqDemuxContext *roq = s->priv_data;
> AVIOContext *pb = s->pb;
> - int framerate;
> - AVStream *st;
> unsigned char preamble[RoQ_CHUNK_PREAMBLE_SIZE];
>
> /* get the main header */
> if (avio_read(pb, preamble, RoQ_CHUNK_PREAMBLE_SIZE) !=
> RoQ_CHUNK_PREAMBLE_SIZE)
> return AVERROR(EIO);
> - framerate = AV_RL16(&preamble[6]);
> + roq->frame_rate = AV_RL16(&preamble[6]);
>
> /* init private context parameters */
> roq->width = roq->height = roq->audio_channels = roq->video_pts =
> roq->audio_frame_count = 0;
> roq->audio_stream_index = -1;
> + roq->video_stream_index = -1;
>
> - st = avformat_new_stream(s, NULL);
> - if (!st)
> - return AVERROR(ENOMEM);
> - avpriv_set_pts_info(st, 63, 1, framerate);
> - roq->video_stream_index = st->index;
> - st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
> - st->codec->codec_id = CODEC_ID_ROQ;
> - st->codec->codec_tag = 0; /* no fourcc */
> + s->ctx_flags |= AVFMTCTX_NOHEADER;
>
> return 0;
> }
> @@ -128,8 +121,16 @@ static int roq_read_packet(AVFormatContext *s,
> switch (chunk_type) {
>
> case RoQ_INFO:
> - if (!roq->width || !roq->height) {
> - AVStream *st = s->streams[roq->video_stream_index];
> + if (roq->video_stream_index == -1) {
> + AVStream *st = avformat_new_stream(s, NULL);
> + if (!st)
> + return AVERROR(ENOMEM);
> + avpriv_set_pts_info(st, 63, 1, roq->frame_rate);
> + roq->video_stream_index = st->index;
> + st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
> + st->codec->codec_id = CODEC_ID_ROQ;
> + st->codec->codec_tag = 0; /* no fourcc */
please align vertically
> +
> if (avio_read(pb, preamble, RoQ_CHUNK_PREAMBLE_SIZE) !=
> RoQ_CHUNK_PREAMBLE_SIZE)
> return AVERROR(EIO);
> st->codec->width = roq->width = AV_RL16(preamble);
ok
Janne
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel