- ThpDemuxContext *thp = s->priv_data;
- AVStream *st;
- ByteIOContext *pb = &s->pb;
- int i;
-
- /* Read the file header. */
-
- get_be32(pb); /* Skip Magic. */
- thp->version = get_be32(pb);
-
- get_be32(pb); /* Max buf size. */
- get_be32(pb); /* Max samples. */
-
- thp->fps = av_d2q(av_int2flt(get_be32(pb)), INT_MAX);
- thp->framecnt = get_be32(pb);
- thp->first_framesz = get_be32(pb);
- get_be32(pb); /* Data size. */
-
- thp->compoff = get_be32(pb);
- get_be32(pb); /* offsetDataOffset. */
- thp->first_frame = get_be32(pb);
- thp->last_frame = get_be32(pb);
-
- thp->next_framesz = thp->first_framesz;
- thp->next_frame = thp->first_frame;
-
- /* Read the component structure. */
- url_fseek (pb, thp->compoff, SEEK_SET);
- thp->compcount = get_be32(pb);
-
- /* Read the list of component types. */
- get_buffer(pb, thp->components, 16);
-
- for (i = 0; i < thp->compcount; i++) {
- if (thp->components[i] == 0) {
- if (thp->vst != 0)
- break;
-
- /* Video component. */
- st = av_new_stream(s, 0);
- if (!st)
- return AVERROR_NOMEM;
-
- /* The denominator and numerator are switched because 1/fps
- is required. */
- av_set_pts_info(st, 64, thp->fps.den, thp->fps.num);
- st->codec->codec_type = CODEC_TYPE_VIDEO;
- st->codec->codec_id = CODEC_ID_THP;
- st->codec->codec_tag = 0; /* no fourcc */
- st->codec->width = get_be32(pb);
- st->codec->height = get_be32(pb);
- st->codec->sample_rate = av_q2d(thp->fps);
- thp->vst = st;
- thp->video_stream_index = st->index;
-
- if (thp->version == 0x11000)
- get_be32(pb); /* Unknown. */
+ ThpDemuxContext *thp = s->priv_data;
+ AVStream *st;
+ AVIOContext *pb = s->pb;
+ int i;
+
+ /* Read the file header. */
+ avio_rb32(pb); /* Skip Magic. */
+ thp->version = avio_rb32(pb);
+
+ avio_rb32(pb); /* Max buf size. */
+ avio_rb32(pb); /* Max samples. */
+
+ thp->fps = av_d2q(av_int2float(avio_rb32(pb)), INT_MAX);
+ thp->framecnt = avio_rb32(pb);
+ thp->first_framesz = avio_rb32(pb);
+ avio_rb32(pb); /* Data size. */
+
+ thp->compoff = avio_rb32(pb);
+ avio_rb32(pb); /* offsetDataOffset. */
+ thp->first_frame = avio_rb32(pb);
+ thp->last_frame = avio_rb32(pb);
+
+ thp->next_framesz = thp->first_framesz;
+ thp->next_frame = thp->first_frame;
+
+ /* Read the component structure. */
+ avio_seek (pb, thp->compoff, SEEK_SET);
+ thp->compcount = avio_rb32(pb);
+
+ /* Read the list of component types. */
+ avio_read(pb, thp->components, 16);
+
+ for (i = 0; i < thp->compcount; i++) {
+ if (thp->components[i] == 0) {
+ if (thp->vst != 0)
+ break;
+
+ /* Video component. */
+ st = avformat_new_stream(s, NULL);
+ if (!st)
+ return AVERROR(ENOMEM);
+
+ /* The denominator and numerator are switched because 1/fps
+ is required. */
+ avpriv_set_pts_info(st, 64, thp->fps.den, thp->fps.num);
+ st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
+ st->codec->codec_id = AV_CODEC_ID_THP;
+ st->codec->codec_tag = 0; /* no fourcc */
+ st->codec->width = avio_rb32(pb);
+ st->codec->height = avio_rb32(pb);
+ st->codec->sample_rate = av_q2d(thp->fps);
+ thp->vst = st;
+ thp->video_stream_index = st->index;
+
+ if (thp->version == 0x11000)
+ avio_rb32(pb); /* Unknown. */
+ } else if (thp->components[i] == 1) {
+ if (thp->has_audio != 0)
+ break;
+
+ /* Audio component. */
+ st = avformat_new_stream(s, NULL);
+ if (!st)
+ return AVERROR(ENOMEM);
+
+ st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
+ st->codec->codec_id = AV_CODEC_ID_ADPCM_THP;
+ st->codec->codec_tag = 0; /* no fourcc */
+ st->codec->channels = avio_rb32(pb); /* numChannels. */
+ st->codec->sample_rate = avio_rb32(pb); /* Frequency. */
+
+ avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
+
+ thp->audio_stream_index = st->index;
+ thp->has_audio = 1;