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

Reply via email to