summaryrefslogtreecommitdiffstats
path: root/libmpcodecs
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2011-04-25 09:48:11 +0000
committerUoti Urpala <uau@mplayer2.org>2011-05-02 00:36:21 +0300
commit84b2296c343e0d3b9bc4fb1a71fd1ba6a9926400 (patch)
tree5015b601d5d7b127aea4652e96ae5a2a8055353c /libmpcodecs
parente7e4d1d8022a012d03dffec728a9a276c4717bf4 (diff)
downloadmpv-84b2296c343e0d3b9bc4fb1a71fd1ba6a9926400.tar.bz2
mpv-84b2296c343e0d3b9bc4fb1a71fd1ba6a9926400.tar.xz
ad_speex: support decoding stream without header packet
Setup default speex modes, allows decoding of speex in flv which does not contain a header packet. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@33327 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpcodecs')
-rw-r--r--libmpcodecs/ad_speex.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/libmpcodecs/ad_speex.c b/libmpcodecs/ad_speex.c
index f8ddc2f336..c9ac1a42c6 100644
--- a/libmpcodecs/ad_speex.c
+++ b/libmpcodecs/ad_speex.c
@@ -63,11 +63,8 @@ static int init(sh_audio_t *sh) {
const uint8_t *hdr = (const uint8_t *)(sh->wf + 1);
const SpeexMode *spx_mode;
const SpeexStereoState st_st = SPEEX_STEREO_STATE_INIT; // hack
- if (!sh->wf || sh->wf->cbSize < 80) {
- mp_msg(MSGT_DECAUDIO, MSGL_FATAL, "Missing extradata!\n");
- goto err_out;
- }
- ctx->hdr = speex_packet_to_header((char *)&sh->wf[1], sh->wf->cbSize);
+ if (sh->wf && sh->wf->cbSize >= 80)
+ ctx->hdr = speex_packet_to_header((char *)&sh->wf[1], sh->wf->cbSize);
if (!ctx->hdr && sh->wf->cbSize == 0x72 && hdr[0] == 1 && hdr[1] == 0) {
// speex.acm format: raw SpeexHeader dump
ctx->hdr = calloc(1, sizeof(*ctx->hdr));
@@ -86,8 +83,18 @@ static int init(sh_audio_t *sh) {
ctx->hdr->frames_per_packet = read_le32(&hdr);
}
if (!ctx->hdr) {
- mp_msg(MSGT_DECAUDIO, MSGL_FATAL, "Invalid extradata!\n");
- goto err_out;
+ mp_msg(MSGT_DECAUDIO, MSGL_ERR, "Invalid or missing extradata! Assuming defaults.\n");
+ ctx->hdr = calloc(1, sizeof(*ctx->hdr));
+ ctx->hdr->frames_per_packet = 1;
+ ctx->hdr->mode = 0;
+ if (sh->wf) {
+ ctx->hdr->nb_channels = sh->wf->nChannels;
+ ctx->hdr->rate = sh->wf->nSamplesPerSec;
+ if (ctx->hdr->rate > 16000)
+ ctx->hdr->mode = 2;
+ else if (ctx->hdr->rate > 8000)
+ ctx->hdr->mode = 1;
+ }
}
if (ctx->hdr->nb_channels != 1 && ctx->hdr->nb_channels != 2) {
mp_msg(MSGT_DECAUDIO, MSGL_WARN, "Invalid number of channels (%i), "
@@ -119,12 +126,6 @@ static int init(sh_audio_t *sh) {
sh->sample_format = AF_FORMAT_S16_NE;
sh->context = ctx;
return 1;
-
-err_out:
- if (ctx)
- free(ctx->hdr);
- free(ctx);
- return 0;
}
static void uninit(sh_audio_t *sh) {