mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-08 13:22:53 +02:00
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.
This commit is contained in:
parent
ce94948198
commit
3f9257c5a5
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user