Commit 20f269dc authored by Mike Melanson's avatar Mike Melanson

handle a wider variety of VQA files, including silent files

Originally committed as revision 2343 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 77a416e8
...@@ -61,6 +61,14 @@ ...@@ -61,6 +61,14 @@
#define SND2_TAG FOURCC_TAG('S', 'N', 'D', '2') #define SND2_TAG FOURCC_TAG('S', 'N', 'D', '2')
#define VQFR_TAG FOURCC_TAG('V', 'Q', 'F', 'R') #define VQFR_TAG FOURCC_TAG('V', 'Q', 'F', 'R')
/* don't know what these tags are for, but acknowledge their existence */
#define CINF_TAG FOURCC_TAG('C', 'I', 'N', 'F')
#define CINH_TAG FOURCC_TAG('C', 'I', 'N', 'H')
#define CIND_TAG FOURCC_TAG('C', 'I', 'N', 'D')
#define PINF_TAG FOURCC_TAG('P', 'I', 'N', 'F')
#define PINH_TAG FOURCC_TAG('P', 'I', 'N', 'H')
#define PIND_TAG FOURCC_TAG('P', 'I', 'N', 'D')
#define VQA_HEADER_SIZE 0x2A #define VQA_HEADER_SIZE 0x2A
#define VQA_FRAMERATE 15 #define VQA_FRAMERATE 15
#define VQA_VIDEO_PTS_INC (90000 / VQA_FRAMERATE) #define VQA_VIDEO_PTS_INC (90000 / VQA_FRAMERATE)
...@@ -227,6 +235,8 @@ static int wsvqa_read_header(AVFormatContext *s, ...@@ -227,6 +235,8 @@ static int wsvqa_read_header(AVFormatContext *s,
AVStream *st; AVStream *st;
unsigned char *header; unsigned char *header;
unsigned char scratch[VQA_PREAMBLE_SIZE]; unsigned char scratch[VQA_PREAMBLE_SIZE];
unsigned int chunk_tag;
unsigned int chunk_size;
/* set the pts reference (1 pts = 1/90000) */ /* set the pts reference (1 pts = 1/90000) */
s->pts_num = 1; s->pts_num = 1;
...@@ -256,7 +266,8 @@ static int wsvqa_read_header(AVFormatContext *s, ...@@ -256,7 +266,8 @@ static int wsvqa_read_header(AVFormatContext *s,
st->codec.width = LE_16(&header[6]); st->codec.width = LE_16(&header[6]);
st->codec.height = LE_16(&header[8]); st->codec.height = LE_16(&header[8]);
/* initialize the audio decoder stream */ /* initialize the audio decoder stream is sample rate is non-zero */
if (LE_16(&header[24])) {
st = av_new_stream(s, 0); st = av_new_stream(s, 0);
if (!st) if (!st)
return AVERROR_NOMEM; return AVERROR_NOMEM;
...@@ -274,13 +285,39 @@ static int wsvqa_read_header(AVFormatContext *s, ...@@ -274,13 +285,39 @@ static int wsvqa_read_header(AVFormatContext *s,
wsvqa->audio_samplerate = st->codec.sample_rate; wsvqa->audio_samplerate = st->codec.sample_rate;
wsvqa->audio_channels = st->codec.channels; wsvqa->audio_channels = st->codec.channels;
wsvqa->audio_frame_counter = 0; wsvqa->audio_frame_counter = 0;
}
/* skip the useless FINF chunk index */ /* there are 0 or more chunks before the FINF chunk; iterate until
* FINF has been skipped and the file will be ready to be demuxed */
do {
if (get_buffer(pb, scratch, VQA_PREAMBLE_SIZE) != VQA_PREAMBLE_SIZE) { if (get_buffer(pb, scratch, VQA_PREAMBLE_SIZE) != VQA_PREAMBLE_SIZE) {
av_free(st->codec.extradata); av_free(st->codec.extradata);
return -EIO; return -EIO;
} }
url_fseek(pb, BE_32(&scratch[4]), SEEK_CUR); chunk_tag = BE_32(&scratch[0]);
chunk_size = BE_32(&scratch[4]);
/* catch any unknown header tags, for curiousity */
switch (chunk_tag) {
case CINF_TAG:
case CINH_TAG:
case CIND_TAG:
case PINF_TAG:
case PINH_TAG:
case PIND_TAG:
case FINF_TAG:
break;
default:
printf (" note: unknown chunk seen (%c%c%c%c)\n",
scratch[0], scratch[1],
scratch[2], scratch[3]);
break;
}
url_fseek(pb, chunk_size, SEEK_CUR);
} while (chunk_tag != FINF_TAG);
wsvqa->video_pts = wsvqa->audio_frame_counter = 0; wsvqa->video_pts = wsvqa->audio_frame_counter = 0;
return 0; return 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment