#include "libavutil/intreadwrite.h"
#include "avformat.h"
+#include "internal.h"
#include "riff.h"
#define XMV_MIN_HEADER_SIZE 36
uint16_t block_align;
uint16_t block_samples;
- enum CodecID codec_id;
+ enum AVCodecID codec_id;
} XMVAudioTrack;
typedef struct XMVVideoPacket {
return 0;
}
-static int xmv_read_header(AVFormatContext *s,
- AVFormatParameters *ap)
+static int xmv_read_close(AVFormatContext *s)
+{
+ XMVDemuxContext *xmv = s->priv_data;
+
+ av_free(xmv->audio);
+ av_free(xmv->audio_tracks);
+
+ return 0;
+}
+
+static int xmv_read_header(AVFormatContext *s)
{
XMVDemuxContext *xmv = s->priv_data;
AVIOContext *pb = s->pb;
uint32_t file_version;
uint32_t this_packet_size;
uint16_t audio_track;
+ int ret;
avio_skip(pb, 4); /* Next packet size */
file_version = avio_rl32(pb);
if ((file_version != 4) && (file_version != 2))
- av_log_ask_for_sample(s, "Found uncommon version %d\n", file_version);
+ avpriv_request_sample(s, "Uncommon version %d", file_version);
/* Video track */
if (!vst)
return AVERROR(ENOMEM);
- av_set_pts_info(vst, 32, 1, 1000);
+ avpriv_set_pts_info(vst, 32, 1, 1000);
vst->codec->codec_type = AVMEDIA_TYPE_VIDEO;
- vst->codec->codec_id = CODEC_ID_WMV2;
+ vst->codec->codec_id = AV_CODEC_ID_WMV2;
vst->codec->codec_tag = MKBETAG('W', 'M', 'V', '2');
vst->codec->width = avio_rl32(pb);
vst->codec->height = avio_rl32(pb);
return AVERROR(ENOMEM);
xmv->audio = av_malloc(xmv->audio_track_count * sizeof(XMVAudioPacket));
- if (!xmv->audio)
- return AVERROR(ENOMEM);
+ if (!xmv->audio) {
+ ret = AVERROR(ENOMEM);
+ goto fail;
+ }
for (audio_track = 0; audio_track < xmv->audio_track_count; audio_track++) {
XMVAudioTrack *track = &xmv->audio_tracks[audio_track];
av_log(s, AV_LOG_WARNING, "Unsupported 5.1 ADPCM audio stream "
"(0x%04X)\n", track->flags);
- ast = av_new_stream(s, audio_track);
- if (!ast)
- return AVERROR(ENOMEM);
+ if (!track->channels || !track->sample_rate) {
+ av_log(s, AV_LOG_ERROR, "Invalid parameters for audio track %d.\n",
+ audio_track);
+ ret = AVERROR_INVALIDDATA;
+ goto fail;
+ }
+
+ ast = avformat_new_stream(s, NULL);
+ if (!ast) {
+ ret = AVERROR(ENOMEM);
+ goto fail;
+ }
ast->codec->codec_type = AVMEDIA_TYPE_AUDIO;
ast->codec->codec_id = track->codec_id;
ast->codec->bit_rate = track->bit_rate;
ast->codec->block_align = 36 * track->channels;
- av_set_pts_info(ast, 32, track->block_samples, track->sample_rate);
+ avpriv_set_pts_info(ast, 32, track->block_samples, track->sample_rate);
packet->stream_index = ast->index;
xmv->stream_count = xmv->audio_track_count + 1;
return 0;
+
+fail:
+ xmv_read_close(s);
+ return ret;
}
static void xmv_read_extradata(uint8_t *extradata, AVIOContext *pb)
* short for every audio track. But as playing around with XMV files with
* ADPCM audio showed, taking the extra 4 bytes from the audio data gives
* you either completely distorted audio or click (when skipping the
- * remaining 68 bytes of the ADPCM block). Substracting 4 bytes for every
+ * remaining 68 bytes of the ADPCM block). Subtracting 4 bytes for every
* audio track from the video data works at least for the audio. Probably
* some alignment thing?
* The video data has (always?) lots of padding, so it should work out...
return 0;
}
-static int xmv_read_close(AVFormatContext *s)
-{
- XMVDemuxContext *xmv = s->priv_data;
-
- av_free(xmv->audio);
- av_free(xmv->audio_tracks);
-
- return 0;
-}
-
AVInputFormat ff_xmv_demuxer = {
.name = "xmv",
.long_name = NULL_IF_CONFIG_SMALL("Microsoft XMV"),