[FFmpeg-cvslog] idroqdec: set AVFMTCTX_NOHEADER and create streams as they occur.

Justin Ruggles git at videolan.org
Thu Dec 22 02:05:07 CET 2011


ffmpeg | branch: master | Justin Ruggles <justin.ruggles at gmail.com> | Mon Dec 19 23:53:04 2011 -0500| [3f9257c5a5b08bc9aa6f7b3e3535e1c5b086ec50] | committer: Justin Ruggles

idroqdec: set AVFMTCTX_NOHEADER and create streams as they occur.

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.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=3f9257c5a5b08bc9aa6f7b3e3535e1c5b086ec50
---

 libavformat/idroqdec.c |   27 ++++++++++++++-------------
 1 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/libavformat/idroqdec.c b/libavformat/idroqdec.c
index 5e347b1..d63c395 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 */
+
                 if (avio_read(pb, preamble, RoQ_CHUNK_PREAMBLE_SIZE) != RoQ_CHUNK_PREAMBLE_SIZE)
                     return AVERROR(EIO);
                 st->codec->width  = roq->width  = AV_RL16(preamble);



More information about the ffmpeg-cvslog mailing list