|
|
|
@ -36,6 +36,7 @@ static int pcm_read_header(AVFormatContext *s) |
|
|
|
|
{ |
|
|
|
|
PCMAudioDemuxerContext *s1 = s->priv_data; |
|
|
|
|
AVStream *st; |
|
|
|
|
uint8_t *mime_type = NULL; |
|
|
|
|
|
|
|
|
|
st = avformat_new_stream(s, NULL); |
|
|
|
|
if (!st) |
|
|
|
@ -47,6 +48,34 @@ static int pcm_read_header(AVFormatContext *s) |
|
|
|
|
st->codecpar->sample_rate = s1->sample_rate; |
|
|
|
|
st->codecpar->channels = s1->channels; |
|
|
|
|
|
|
|
|
|
av_opt_get(s->pb, "mime_type", AV_OPT_SEARCH_CHILDREN, &mime_type); |
|
|
|
|
if (mime_type && s->iformat->mime_type) { |
|
|
|
|
int rate = 0, channels = 0; |
|
|
|
|
size_t len = strlen(s->iformat->mime_type); |
|
|
|
|
if (!strncmp(s->iformat->mime_type, mime_type, len)) { |
|
|
|
|
uint8_t *options = mime_type + len; |
|
|
|
|
len = strlen(mime_type); |
|
|
|
|
while (options < mime_type + len) { |
|
|
|
|
options = strstr(options, ";"); |
|
|
|
|
if (!options++) |
|
|
|
|
break; |
|
|
|
|
if (!rate) |
|
|
|
|
sscanf(options, " rate=%d", &rate); |
|
|
|
|
if (!channels) |
|
|
|
|
sscanf(options, " channels=%d", &channels); |
|
|
|
|
} |
|
|
|
|
if (rate <= 0) { |
|
|
|
|
av_log(s, AV_LOG_ERROR, |
|
|
|
|
"Invalid sample_rate found in mime_type \"%s\"\n", |
|
|
|
|
mime_type); |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
} |
|
|
|
|
st->codecpar->sample_rate = rate; |
|
|
|
|
if (channels > 0) |
|
|
|
|
st->codecpar->channels = channels; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
st->codecpar->bits_per_coded_sample = |
|
|
|
|
av_get_bits_per_sample(st->codecpar->codec_id); |
|
|
|
|
|
|
|
|
@ -65,7 +94,7 @@ static const AVOption pcm_options[] = { |
|
|
|
|
{ NULL }, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
#define PCMDEF(name_, long_name_, ext, codec) \ |
|
|
|
|
#define PCMDEF(name_, long_name_, ext, codec, ...) \ |
|
|
|
|
static const AVClass name_ ## _demuxer_class = { \
|
|
|
|
|
.class_name = #name_ " demuxer", \
|
|
|
|
|
.item_name = av_default_item_name, \
|
|
|
|
@ -82,6 +111,7 @@ AVInputFormat ff_pcm_ ## name_ ## _demuxer = { \ |
|
|
|
|
.flags = AVFMT_GENERIC_INDEX, \
|
|
|
|
|
.extensions = ext, \
|
|
|
|
|
.raw_codec_id = codec, \
|
|
|
|
|
__VA_ARGS__ \
|
|
|
|
|
.priv_class = &name_ ## _demuxer_class, \
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
@ -113,7 +143,7 @@ PCMDEF(s16be, "PCM signed 16-bit big-endian", |
|
|
|
|
AV_NE("sw", NULL), AV_CODEC_ID_PCM_S16BE) |
|
|
|
|
|
|
|
|
|
PCMDEF(s16le, "PCM signed 16-bit little-endian", |
|
|
|
|
AV_NE(NULL, "sw"), AV_CODEC_ID_PCM_S16LE) |
|
|
|
|
AV_NE(NULL, "sw"), AV_CODEC_ID_PCM_S16LE, .mime_type = "audio/L16",) |
|
|
|
|
|
|
|
|
|
PCMDEF(s8, "PCM signed 8-bit", |
|
|
|
|
"sb", AV_CODEC_ID_PCM_S8) |
|
|
|
|