git.videolan.org
/
ffmpeg.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
wavpack: determine sample_fmt before requesting a buffer
[ffmpeg.git]
/
libavcodec
/
wavpack.c
diff --git
a/libavcodec/wavpack.c
b/libavcodec/wavpack.c
index
7d16a9b
..
95a67a9
100644
(file)
--- a/
libavcodec/wavpack.c
+++ b/
libavcodec/wavpack.c
@@
-783,13
+783,6
@@
static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
s->samples = wc->samples;
}
s->frame_flags = AV_RL32(buf); buf += 4;
s->samples = wc->samples;
}
s->frame_flags = AV_RL32(buf); buf += 4;
- if(s->frame_flags&0x80){
- avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
- } else if((s->frame_flags&0x03) <= 1){
- avctx->sample_fmt = AV_SAMPLE_FMT_S16;
- } else {
- avctx->sample_fmt = AV_SAMPLE_FMT_S32;
- }
bpp = av_get_bytes_per_sample(avctx->sample_fmt);
samples = (uint8_t*)samples + bpp * wc->ch_offset;
bpp = av_get_bytes_per_sample(avctx->sample_fmt);
samples = (uint8_t*)samples + bpp * wc->ch_offset;
@@
-1147,7
+1140,7
@@
static int wavpack_decode_frame(AVCodecContext *avctx, void *data,
WavpackContext *s = avctx->priv_data;
const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size;
WavpackContext *s = avctx->priv_data;
const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size;
- int frame_size, ret;
+ int frame_size, ret
, frame_flags
;
int samplecount = 0;
s->block = 0;
int samplecount = 0;
s->block = 0;
@@
-1155,12
+1148,16
@@
static int wavpack_decode_frame(AVCodecContext *avctx, void *data,
/* determine number of samples */
if(s->mkv_mode){
/* determine number of samples */
if(s->mkv_mode){
- s->samples = AV_RL32(buf); buf += 4;
+ s->samples = AV_RL32(buf); buf += 4;
+ frame_flags = AV_RL32(buf);
} else {
} else {
- if (s->multichannel)
- s->samples = AV_RL32(buf + 4);
- else
- s->samples = AV_RL32(buf);
+ if (s->multichannel) {
+ s->samples = AV_RL32(buf + 4);
+ frame_flags = AV_RL32(buf + 8);
+ } else {
+ s->samples = AV_RL32(buf);
+ frame_flags = AV_RL32(buf + 4);
+ }
}
if (s->samples <= 0) {
av_log(avctx, AV_LOG_ERROR, "Invalid number of samples: %d\n",
}
if (s->samples <= 0) {
av_log(avctx, AV_LOG_ERROR, "Invalid number of samples: %d\n",
@@
-1168,6
+1165,14
@@
static int wavpack_decode_frame(AVCodecContext *avctx, void *data,
return AVERROR(EINVAL);
}
return AVERROR(EINVAL);
}
+ if (frame_flags & 0x80) {
+ avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
+ } else if ((frame_flags & 0x03) <= 1) {
+ avctx->sample_fmt = AV_SAMPLE_FMT_S16;
+ } else {
+ avctx->sample_fmt = AV_SAMPLE_FMT_S32;
+ }
+
/* get output buffer */
s->frame.nb_samples = s->samples;
if ((ret = avctx->get_buffer(avctx, &s->frame)) < 0) {
/* get output buffer */
s->frame.nb_samples = s->samples;
if ((ret = avctx->get_buffer(avctx, &s->frame)) < 0) {