Compare commits
128 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
e66860a66b | ||
![]() |
661ee45f88 | ||
![]() |
fa5292d9d4 | ||
![]() |
a6a61a6d1d | ||
![]() |
b8fc301769 | ||
![]() |
9b667da05d | ||
![]() |
4007352bd0 | ||
![]() |
5c6a2d9878 | ||
![]() |
17c54e9317 | ||
![]() |
14d4eee547 | ||
![]() |
07624cfeaa | ||
![]() |
d6f763659c | ||
![]() |
e297459eb6 | ||
![]() |
afe2726089 | ||
![]() |
23f0d0f16b | ||
![]() |
47953c33ea | ||
![]() |
64a854d06b | ||
![]() |
91805f06a3 | ||
![]() |
8120a1d9bd | ||
![]() |
211a107208 | ||
![]() |
fdd09e5d7b | ||
![]() |
00d35e82b2 | ||
![]() |
807342e1cf | ||
![]() |
abaf8c386e | ||
![]() |
e5578ad3cd | ||
![]() |
4e0fae982e | ||
![]() |
f62fa1ce9f | ||
![]() |
8a63deab15 | ||
![]() |
fe06305b0d | ||
![]() |
d58c5586ec | ||
![]() |
0411b19289 | ||
![]() |
fd30240e98 | ||
![]() |
54e4bf3296 | ||
![]() |
1e1015fd22 | ||
![]() |
c4a34f4025 | ||
![]() |
cba03dc667 | ||
![]() |
5a3f494466 | ||
![]() |
112431705d | ||
![]() |
864581fea3 | ||
![]() |
d8acee792f | ||
![]() |
0e3dec6b08 | ||
![]() |
711e6c947b | ||
![]() |
8491677ab6 | ||
![]() |
f98bb0d3ec | ||
![]() |
346e089d25 | ||
![]() |
0ac6777a34 | ||
![]() |
ae2d3d6be0 | ||
![]() |
998fc04bcf | ||
![]() |
43fa5bf55e | ||
![]() |
f19b8d9533 | ||
![]() |
4a66fe2107 | ||
![]() |
edf3c5a3eb | ||
![]() |
a39b5e8b32 | ||
![]() |
6ae93d0304 | ||
![]() |
241f15f1c9 | ||
![]() |
2137d99086 | ||
![]() |
e9de2d98a9 | ||
![]() |
93f1159af5 | ||
![]() |
b08001e00a | ||
![]() |
e1ea35fb52 | ||
![]() |
cbfd34246c | ||
![]() |
feef77ec3a | ||
![]() |
f531193690 | ||
![]() |
e86e9f8b7a | ||
![]() |
15a7fe106c | ||
![]() |
d32f509de1 | ||
![]() |
5f5f36b52e | ||
![]() |
d1166f03be | ||
![]() |
d51c7b4cbe | ||
![]() |
e58870a587 | ||
![]() |
5c18bcfd9c | ||
![]() |
62cf52c860 | ||
![]() |
7e95a12d51 | ||
![]() |
2c0cddf255 | ||
![]() |
d398d042c1 | ||
![]() |
5ae87280e2 | ||
![]() |
7d02df7036 | ||
![]() |
1c3d46a924 | ||
![]() |
800ab099e3 | ||
![]() |
e6b2255329 | ||
![]() |
7f7b2e89e2 | ||
![]() |
73f85eae68 | ||
![]() |
9b6080f685 | ||
![]() |
190807a56c | ||
![]() |
33029d7353 | ||
![]() |
c41950099d | ||
![]() |
f65e396aa1 | ||
![]() |
115d88c4b2 | ||
![]() |
a65045915f | ||
![]() |
adb12c4deb | ||
![]() |
ca58b215ab | ||
![]() |
67c46b9b30 | ||
![]() |
7ab0b6b7ed | ||
![]() |
b832e539c0 | ||
![]() |
2fdbc1d553 | ||
![]() |
5415c488f9 | ||
![]() |
79bafbb0dd | ||
![]() |
7b3c851526 | ||
![]() |
1b6e6439fa | ||
![]() |
4474051370 | ||
![]() |
1646d2d2ae | ||
![]() |
edc942202b | ||
![]() |
f7be632cbd | ||
![]() |
4ba0e03759 | ||
![]() |
37ce6ba425 | ||
![]() |
c2c83dcb32 | ||
![]() |
4c5cdb493c | ||
![]() |
06b15b3715 | ||
![]() |
614ef0dc0d | ||
![]() |
5d2b6006f0 | ||
![]() |
b491c15c85 | ||
![]() |
2809f4ab93 | ||
![]() |
c2d017e88f | ||
![]() |
4f45967cf5 | ||
![]() |
78eab18740 | ||
![]() |
902e9595e3 | ||
![]() |
d33a1d6507 | ||
![]() |
fc8c0ee09f | ||
![]() |
490617b6ff | ||
![]() |
b833859daa | ||
![]() |
7d52ed686b | ||
![]() |
f74d1c6de7 | ||
![]() |
e49abd1d92 | ||
![]() |
414409e6c5 | ||
![]() |
09a288476f | ||
![]() |
b981c5d4e0 | ||
![]() |
60171d8fa6 | ||
![]() |
a39b603bf6 |
2
Doxyfile
2
Doxyfile
@@ -31,7 +31,7 @@ PROJECT_NAME = FFmpeg
|
||||
# This could be handy for archiving the generated documentation or
|
||||
# if some version control system is used.
|
||||
|
||||
PROJECT_NUMBER = 0.8.5
|
||||
PROJECT_NUMBER = 0.8.7
|
||||
|
||||
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
|
||||
# base path where the generated documentation will be put.
|
||||
|
@@ -19,7 +19,7 @@ ffmpeg:
|
||||
ffmpeg.c Michael Niedermayer
|
||||
|
||||
ffplay:
|
||||
ffplay.c Michael Niedermayer
|
||||
ffplay.c Marton Balint
|
||||
|
||||
ffprobe:
|
||||
ffprobe.c Stefano Sabatini
|
||||
|
4
configure
vendored
4
configure
vendored
@@ -2203,7 +2203,7 @@ case "$arch" in
|
||||
arch="sparc"
|
||||
subarch="sparc64"
|
||||
;;
|
||||
i[3-6]86|i86pc|BePC|x86pc|x86_64|amd64)
|
||||
i[3-6]86|i86pc|BePC|x86pc|x86_64|x86_32|amd64)
|
||||
arch="x86"
|
||||
;;
|
||||
esac
|
||||
@@ -3164,7 +3164,7 @@ check_deps $CONFIG_LIST \
|
||||
|
||||
enabled asm || { arch=c; disable $ARCH_LIST $ARCH_EXT_LIST; }
|
||||
|
||||
if test $target_os == "haiku"; then
|
||||
if test $target_os = "haiku"; then
|
||||
disable memalign
|
||||
disable posix_memalign
|
||||
fi
|
||||
|
@@ -13,6 +13,7 @@ libavutil: 2011-04-18
|
||||
|
||||
API changes, most recent first:
|
||||
|
||||
|
||||
2011-06-19 - xxxxxxx - lavfi 2.23.0 - avfilter.h
|
||||
Add layout negotiation fields and helper functions.
|
||||
|
||||
@@ -43,6 +44,12 @@ API changes, most recent first:
|
||||
2011-06-12 - xxxxxxx - lavfi 2.16.0 - avfilter_graph_parse()
|
||||
Change avfilter_graph_parse() signature.
|
||||
|
||||
2011-07-10 - xxxxxxx - lavf 53.3.0
|
||||
Add avformat_find_stream_info(), deprecate av_find_stream_info().
|
||||
|
||||
2011-07-10 - xxxxxxx - lavc 53.6.0
|
||||
Add avcodec_open2(), deprecate avcodec_open().
|
||||
|
||||
2011-06-xx - xxxxxxx - lavf 53.2.0 - avformat.h
|
||||
Add avformat_open_input and avformat_write_header().
|
||||
Deprecate av_open_input_stream, av_open_input_file,
|
||||
|
7
ffplay.c
7
ffplay.c
@@ -2135,7 +2135,12 @@ static int stream_component_open(VideoState *is, int stream_index)
|
||||
|
||||
avctx->workaround_bugs = workaround_bugs;
|
||||
avctx->lowres = lowres;
|
||||
if(lowres) avctx->flags |= CODEC_FLAG_EMU_EDGE;
|
||||
if(avctx->lowres > codec->max_lowres){
|
||||
av_log(avctx, AV_LOG_WARNING, "The maximum value for lowres supported by the decoder is %d\n",
|
||||
codec->max_lowres);
|
||||
avctx->lowres= codec->max_lowres;
|
||||
}
|
||||
if(avctx->lowres) avctx->flags |= CODEC_FLAG_EMU_EDGE;
|
||||
avctx->idct_algo= idct;
|
||||
if(fast) avctx->flags2 |= CODEC_FLAG2_FAST;
|
||||
avctx->skip_frame= skip_frame;
|
||||
|
@@ -279,7 +279,7 @@ static void init_mv(FourXContext *f){
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline void mcdc(uint16_t *dst, uint16_t *src, int log2w, int h, int stride, int scale, int dc){
|
||||
static inline void mcdc(uint16_t *dst, uint16_t *src, int log2w, int h, int stride, int scale, unsigned dc){
|
||||
int i;
|
||||
dc*= 0x10001;
|
||||
|
||||
|
@@ -1090,7 +1090,7 @@ static int decode_spectrum_and_dequant(AACContext *ac, float coef[1024],
|
||||
GET_VLC(code, re, gb, vlc_tab, 8, 2);
|
||||
cb_idx = cb_vector_idx[code];
|
||||
nnz = cb_idx >> 8 & 15;
|
||||
bits = SHOW_UBITS(re, gb, nnz) << (32-nnz);
|
||||
bits = nnz ? GET_CACHE(re, gb) : 0;
|
||||
LAST_SKIP_BITS(re, gb, nnz);
|
||||
cf = VMUL4S(cf, vq, cb_idx, bits, sf + idx);
|
||||
} while (len -= 4);
|
||||
@@ -1130,7 +1130,7 @@ static int decode_spectrum_and_dequant(AACContext *ac, float coef[1024],
|
||||
GET_VLC(code, re, gb, vlc_tab, 8, 2);
|
||||
cb_idx = cb_vector_idx[code];
|
||||
nnz = cb_idx >> 8 & 15;
|
||||
sign = SHOW_UBITS(re, gb, nnz) << (cb_idx >> 12);
|
||||
sign = nnz ? SHOW_UBITS(re, gb, nnz) << (cb_idx >> 12) : 0;
|
||||
LAST_SKIP_BITS(re, gb, nnz);
|
||||
cf = VMUL2S(cf, vq, cb_idx, sign, sf + idx);
|
||||
} while (len -= 2);
|
||||
|
@@ -163,6 +163,18 @@ typedef struct APEContext {
|
||||
|
||||
// TODO: dsputilize
|
||||
|
||||
static av_cold int ape_decode_close(AVCodecContext * avctx)
|
||||
{
|
||||
APEContext *s = avctx->priv_data;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < APE_FILTER_LEVELS; i++)
|
||||
av_freep(&s->filterbuf[i]);
|
||||
|
||||
av_freep(&s->data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static av_cold int ape_decode_init(AVCodecContext * avctx)
|
||||
{
|
||||
APEContext *s = avctx->priv_data;
|
||||
@@ -195,25 +207,18 @@ static av_cold int ape_decode_init(AVCodecContext * avctx)
|
||||
for (i = 0; i < APE_FILTER_LEVELS; i++) {
|
||||
if (!ape_filter_orders[s->fset][i])
|
||||
break;
|
||||
s->filterbuf[i] = av_malloc((ape_filter_orders[s->fset][i] * 3 + HISTORY_SIZE) * 4);
|
||||
FF_ALLOC_OR_GOTO(avctx, s->filterbuf[i],
|
||||
(ape_filter_orders[s->fset][i] * 3 + HISTORY_SIZE) * 4,
|
||||
filter_alloc_fail);
|
||||
}
|
||||
|
||||
dsputil_init(&s->dsp, avctx);
|
||||
avctx->sample_fmt = AV_SAMPLE_FMT_S16;
|
||||
avctx->channel_layout = (avctx->channels==2) ? AV_CH_LAYOUT_STEREO : AV_CH_LAYOUT_MONO;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static av_cold int ape_decode_close(AVCodecContext * avctx)
|
||||
{
|
||||
APEContext *s = avctx->priv_data;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < APE_FILTER_LEVELS; i++)
|
||||
av_freep(&s->filterbuf[i]);
|
||||
|
||||
av_freep(&s->data);
|
||||
return 0;
|
||||
filter_alloc_fail:
|
||||
ape_decode_close(avctx);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -797,7 +802,7 @@ static int ape_decode_frame(AVCodecContext * avctx,
|
||||
int buf_size = avpkt->size;
|
||||
APEContext *s = avctx->priv_data;
|
||||
int16_t *samples = data;
|
||||
int nblocks;
|
||||
uint32_t nblocks;
|
||||
int i, n;
|
||||
int blockstodecode;
|
||||
int bytes_used;
|
||||
@@ -814,12 +819,15 @@ static int ape_decode_frame(AVCodecContext * avctx,
|
||||
}
|
||||
|
||||
if(!s->samples){
|
||||
s->data = av_realloc(s->data, (buf_size + 3) & ~3);
|
||||
void *tmp_data = av_realloc(s->data, (buf_size + 3) & ~3);
|
||||
if (!tmp_data)
|
||||
return AVERROR(ENOMEM);
|
||||
s->data = tmp_data;
|
||||
s->dsp.bswap_buf((uint32_t*)s->data, (const uint32_t*)buf, buf_size >> 2);
|
||||
s->ptr = s->last_ptr = s->data;
|
||||
s->data_end = s->data + buf_size;
|
||||
|
||||
nblocks = s->samples = bytestream_get_be32(&s->ptr);
|
||||
nblocks = bytestream_get_be32(&s->ptr);
|
||||
n = bytestream_get_be32(&s->ptr);
|
||||
if(n < 0 || n > 3){
|
||||
av_log(avctx, AV_LOG_ERROR, "Incorrect offset passed\n");
|
||||
@@ -828,12 +836,13 @@ static int ape_decode_frame(AVCodecContext * avctx,
|
||||
}
|
||||
s->ptr += n;
|
||||
|
||||
s->currentframeblocks = nblocks;
|
||||
buf += 4;
|
||||
if (s->samples <= 0) {
|
||||
if (!nblocks || nblocks > INT_MAX) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Invalid sample count: %u.\n", nblocks);
|
||||
*data_size = 0;
|
||||
return buf_size;
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
s->currentframeblocks = s->samples = nblocks;
|
||||
|
||||
memset(s->decoded0, 0, sizeof(s->decoded0));
|
||||
memset(s->decoded1, 0, sizeof(s->decoded1));
|
||||
|
@@ -276,7 +276,7 @@ static int atrac1_decode_frame(AVCodecContext *avctx, void *data,
|
||||
const uint8_t *buf = avpkt->data;
|
||||
int buf_size = avpkt->size;
|
||||
AT1Ctx *q = avctx->priv_data;
|
||||
int ch, ret, i;
|
||||
int ch, ret, i, out_size;
|
||||
GetBitContext gb;
|
||||
float* samples = data;
|
||||
|
||||
@@ -286,6 +286,13 @@ static int atrac1_decode_frame(AVCodecContext *avctx, void *data,
|
||||
return -1;
|
||||
}
|
||||
|
||||
out_size = q->channels * AT1_SU_SAMPLES *
|
||||
av_get_bytes_per_sample(avctx->sample_fmt);
|
||||
if (*data_size < out_size) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Output buffer is too small\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
for (ch = 0; ch < q->channels; ch++) {
|
||||
AT1SUCtx* su = &q->SUs[ch];
|
||||
|
||||
@@ -318,7 +325,7 @@ static int atrac1_decode_frame(AVCodecContext *avctx, void *data,
|
||||
}
|
||||
}
|
||||
|
||||
*data_size = q->channels * AT1_SU_SAMPLES * sizeof(*samples);
|
||||
*data_size = out_size;
|
||||
return avctx->block_align;
|
||||
}
|
||||
|
||||
@@ -329,6 +336,11 @@ static av_cold int atrac1_decode_init(AVCodecContext *avctx)
|
||||
|
||||
avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
|
||||
|
||||
if (avctx->channels < 1 || avctx->channels > AT1_MAX_CHANNELS) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Unsupported number of channels: %d\n",
|
||||
avctx->channels);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
q->channels = avctx->channels;
|
||||
|
||||
/* Init the mdct transforms */
|
||||
|
@@ -30,6 +30,7 @@
|
||||
#include "libavutil/samplefmt.h"
|
||||
#include "libavutil/avutil.h"
|
||||
#include "libavutil/cpu.h"
|
||||
#include "libavutil/dict.h"
|
||||
|
||||
#include "libavcodec/version.h"
|
||||
|
||||
@@ -3683,6 +3684,7 @@ int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, v
|
||||
int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int, int),void *arg, int *ret, int count);
|
||||
//FIXME func typedef
|
||||
|
||||
#if FF_API_AVCODEC_OPEN
|
||||
/**
|
||||
* Initialize the AVCodecContext to use the given AVCodec. Prior to using this
|
||||
* function the context has to be allocated.
|
||||
@@ -3709,8 +3711,44 @@ int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2,
|
||||
* @param codec The codec to use within the context.
|
||||
* @return zero on success, a negative value on error
|
||||
* @see avcodec_alloc_context, avcodec_find_decoder, avcodec_find_encoder, avcodec_close
|
||||
*
|
||||
* @deprecated use avcodec_open2
|
||||
*/
|
||||
int avcodec_open(AVCodecContext *avctx, AVCodec *codec);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Initialize the AVCodecContext to use the given AVCodec. Prior to using this
|
||||
* function the context has to be allocated with avcodec_alloc_context().
|
||||
*
|
||||
* The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(),
|
||||
* avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for
|
||||
* retrieving a codec.
|
||||
*
|
||||
* @warning This function is not thread safe!
|
||||
*
|
||||
* @code
|
||||
* avcodec_register_all();
|
||||
* av_dict_set(&opts, "b", "2.5M", 0);
|
||||
* codec = avcodec_find_decoder(CODEC_ID_H264);
|
||||
* if (!codec)
|
||||
* exit(1);
|
||||
*
|
||||
* context = avcodec_alloc_context();
|
||||
*
|
||||
* if (avcodec_open(context, codec, opts) < 0)
|
||||
* exit(1);
|
||||
* @endcode
|
||||
*
|
||||
* @param avctx The context to initialize.
|
||||
* @param options A dictionary filled with AVCodecContext and codec-private options.
|
||||
* On return this object will be filled with options that were not found.
|
||||
*
|
||||
* @return zero on success, a negative value on error
|
||||
* @see avcodec_alloc_context3(), avcodec_find_decoder(), avcodec_find_encoder(),
|
||||
* av_dict_set(), av_opt_find().
|
||||
*/
|
||||
int avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options);
|
||||
|
||||
/**
|
||||
* Decode the audio frame of size avpkt->size from avpkt->data into samples.
|
||||
|
@@ -153,11 +153,18 @@ static const uint8_t rle_length_tab[16] = {
|
||||
2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 32, 64
|
||||
};
|
||||
|
||||
#define GET_BITS_SAFE(out, nbits) do { \
|
||||
if (get_bits_left(gb) < nbits) \
|
||||
return AVERROR_INVALIDDATA; \
|
||||
out = get_bits(gb, nbits); \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
* Decode Bink Audio block
|
||||
* @param[out] out Output buffer (must contain s->block_size elements)
|
||||
* @return 0 on success, negative error code on failure
|
||||
*/
|
||||
static void decode_block(BinkAudioContext *s, short *out, int use_dct)
|
||||
static int decode_block(BinkAudioContext *s, short *out, int use_dct)
|
||||
{
|
||||
int ch, i, j, k;
|
||||
float q, quant[25];
|
||||
@@ -170,13 +177,19 @@ static void decode_block(BinkAudioContext *s, short *out, int use_dct)
|
||||
for (ch = 0; ch < s->channels; ch++) {
|
||||
FFTSample *coeffs = s->coeffs_ptr[ch];
|
||||
if (s->version_b) {
|
||||
if (get_bits_left(gb) < 64)
|
||||
return AVERROR_INVALIDDATA;
|
||||
coeffs[0] = av_int2flt(get_bits(gb, 32)) * s->root;
|
||||
coeffs[1] = av_int2flt(get_bits(gb, 32)) * s->root;
|
||||
} else {
|
||||
if (get_bits_left(gb) < 58)
|
||||
return AVERROR_INVALIDDATA;
|
||||
coeffs[0] = get_float(gb) * s->root;
|
||||
coeffs[1] = get_float(gb) * s->root;
|
||||
}
|
||||
|
||||
if (get_bits_left(gb) < s->num_bands * 8)
|
||||
return AVERROR_INVALIDDATA;
|
||||
for (i = 0; i < s->num_bands; i++) {
|
||||
/* constant is result of 0.066399999/log10(M_E) */
|
||||
int value = get_bits(gb, 8);
|
||||
@@ -191,15 +204,20 @@ static void decode_block(BinkAudioContext *s, short *out, int use_dct)
|
||||
while (i < s->frame_len) {
|
||||
if (s->version_b) {
|
||||
j = i + 16;
|
||||
} else if (get_bits1(gb)) {
|
||||
j = i + rle_length_tab[get_bits(gb, 4)] * 8;
|
||||
} else {
|
||||
j = i + 8;
|
||||
int v;
|
||||
GET_BITS_SAFE(v, 1);
|
||||
if (v) {
|
||||
GET_BITS_SAFE(v, 4);
|
||||
j = i + rle_length_tab[v] * 8;
|
||||
} else {
|
||||
j = i + 8;
|
||||
}
|
||||
}
|
||||
|
||||
j = FFMIN(j, s->frame_len);
|
||||
|
||||
width = get_bits(gb, 4);
|
||||
GET_BITS_SAFE(width, 4);
|
||||
if (width == 0) {
|
||||
memset(coeffs + i, 0, (j - i) * sizeof(*coeffs));
|
||||
i = j;
|
||||
@@ -209,9 +227,11 @@ static void decode_block(BinkAudioContext *s, short *out, int use_dct)
|
||||
while (i < j) {
|
||||
if (s->bands[k] == i)
|
||||
q = quant[k++];
|
||||
coeff = get_bits(gb, width);
|
||||
GET_BITS_SAFE(coeff, width);
|
||||
if (coeff) {
|
||||
if (get_bits1(gb))
|
||||
int v;
|
||||
GET_BITS_SAFE(v, 1);
|
||||
if (v)
|
||||
coeffs[i] = -q * coeff;
|
||||
else
|
||||
coeffs[i] = q * coeff;
|
||||
@@ -247,6 +267,8 @@ static void decode_block(BinkAudioContext *s, short *out, int use_dct)
|
||||
s->overlap_len * s->channels * sizeof(*out));
|
||||
|
||||
s->first = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static av_cold int decode_end(AVCodecContext *avctx)
|
||||
@@ -278,12 +300,17 @@ static int decode_frame(AVCodecContext *avctx,
|
||||
int reported_size;
|
||||
GetBitContext *gb = &s->gb;
|
||||
|
||||
if (buf_size < 4) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Packet is too small\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
init_get_bits(gb, buf, buf_size * 8);
|
||||
|
||||
reported_size = get_bits_long(gb, 32);
|
||||
while (get_bits_count(gb) / 8 < buf_size &&
|
||||
samples + s->block_size <= samples_end) {
|
||||
decode_block(s, samples, avctx->codec->id == CODEC_ID_BINKAUDIO_DCT);
|
||||
while (samples + s->block_size <= samples_end) {
|
||||
if (decode_block(s, samples, avctx->codec->id == CODEC_ID_BINKAUDIO_DCT))
|
||||
break;
|
||||
samples += s->block_size;
|
||||
get_bits_align32(gb);
|
||||
}
|
||||
|
@@ -366,6 +366,8 @@ static int cinepak_decode (CinepakContext *s)
|
||||
s->strips[i].x2 = s->avctx->width;
|
||||
|
||||
strip_size = AV_RB24 (&s->data[1]) - 12;
|
||||
if(strip_size < 0)
|
||||
return -1;
|
||||
s->data += 12;
|
||||
strip_size = ((s->data + strip_size) > eod) ? (eod - s->data) : strip_size;
|
||||
|
||||
|
@@ -1079,7 +1079,7 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
|
||||
q->subpacket[s].subbands = bytestream_get_be16(&edata_ptr);
|
||||
extradata_size -= 8;
|
||||
}
|
||||
if (avctx->extradata_size >= 8){
|
||||
if (extradata_size >= 8){
|
||||
bytestream_get_be32(&edata_ptr); //Unknown unused
|
||||
q->subpacket[s].js_subband_start = bytestream_get_be16(&edata_ptr);
|
||||
q->subpacket[s].js_vlc_bits = bytestream_get_be16(&edata_ptr);
|
||||
|
@@ -905,7 +905,8 @@ static void qmf_32_subbands(DCAContext * s, int chans,
|
||||
for (subindex = 0; subindex < 8; subindex++) {
|
||||
/* Load in one sample from each subband and clear inactive subbands */
|
||||
for (i = 0; i < sb_act; i++){
|
||||
uint32_t v = AV_RN32A(&samples_in[i][subindex]) ^ ((i-1)&2)<<30;
|
||||
unsigned sign = (i - 1) & 2;
|
||||
uint32_t v = AV_RN32A(&samples_in[i][subindex]) ^ sign << 30;
|
||||
AV_WN32A(&s->raXin[i], v);
|
||||
}
|
||||
|
||||
|
@@ -310,6 +310,11 @@ static av_cold int cinaudio_decode_init(AVCodecContext *avctx)
|
||||
CinAudioContext *cin = avctx->priv_data;
|
||||
|
||||
cin->avctx = avctx;
|
||||
if (avctx->channels != 1) {
|
||||
av_log_ask_for_sample(avctx, "Number of channels is not supported\n");
|
||||
return AVERROR_PATCHWELCOME;
|
||||
}
|
||||
|
||||
cin->initial_decode_frame = 1;
|
||||
cin->delta = 0;
|
||||
avctx->sample_fmt = AV_SAMPLE_FMT_S16;
|
||||
|
@@ -248,11 +248,13 @@ static const DVprofile dv_profiles[] = {
|
||||
const DVprofile* ff_dv_frame_profile(const DVprofile *sys,
|
||||
const uint8_t* frame, unsigned buf_size)
|
||||
{
|
||||
int i;
|
||||
int i, dsf, stype;
|
||||
|
||||
int dsf = (frame[3] & 0x80) >> 7;
|
||||
if(buf_size < DV_PROFILE_BYTES)
|
||||
return NULL;
|
||||
|
||||
int stype = frame[80*5 + 48 + 3] & 0x1f;
|
||||
dsf = (frame[3] & 0x80) >> 7;
|
||||
stype = frame[80*5 + 48 + 3] & 0x1f;
|
||||
|
||||
/* 576i50 25Mbps 4:1:1 is a special case */
|
||||
if (dsf == 1 && stype == 0 && frame[4] & 0x07 /* the APT field */) {
|
||||
|
@@ -85,15 +85,21 @@ static inline void comp_block(MadContext *t, int mb_x, int mb_y,
|
||||
{
|
||||
MpegEncContext *s = &t->s;
|
||||
if (j < 4) {
|
||||
unsigned offset = (mb_y*16 + ((j&2)<<2) + mv_y)*t->last_frame.linesize[0] + mb_x*16 + ((j&1)<<3) + mv_x;
|
||||
if (offset >= (s->height - 7) * t->last_frame.linesize[0] - 7)
|
||||
return;
|
||||
comp(t->frame.data[0] + (mb_y*16 + ((j&2)<<2))*t->frame.linesize[0] + mb_x*16 + ((j&1)<<3),
|
||||
t->frame.linesize[0],
|
||||
t->last_frame.data[0] + (mb_y*16 + ((j&2)<<2) + mv_y)*t->last_frame.linesize[0] + mb_x*16 + ((j&1)<<3) + mv_x,
|
||||
t->last_frame.data[0] + offset,
|
||||
t->last_frame.linesize[0], add);
|
||||
} else if (!(s->avctx->flags & CODEC_FLAG_GRAY)) {
|
||||
int index = j - 3;
|
||||
unsigned offset = (mb_y * 8 + (mv_y/2))*t->last_frame.linesize[index] + mb_x * 8 + (mv_x/2);
|
||||
if (offset >= (s->height/2 - 7) * t->last_frame.linesize[index] - 7)
|
||||
return;
|
||||
comp(t->frame.data[index] + (mb_y*8)*t->frame.linesize[index] + mb_x * 8,
|
||||
t->frame.linesize[index],
|
||||
t->last_frame.data[index] + (mb_y * 8 + (mv_y/2))*t->last_frame.linesize[index] + mb_x * 8 + (mv_x/2),
|
||||
t->last_frame.data[index] + offset,
|
||||
t->last_frame.linesize[index], add);
|
||||
}
|
||||
}
|
||||
@@ -205,7 +211,8 @@ static void decode_mb(MadContext *t, int inter)
|
||||
for (j=0; j<6; j++) {
|
||||
if (mv_map & (1<<j)) { // mv_x and mv_y are guarded by mv_map
|
||||
int add = 2*decode_motion(&s->gb);
|
||||
comp_block(t, s->mb_x, s->mb_y, j, mv_x, mv_y, add);
|
||||
if (t->last_frame.data[0])
|
||||
comp_block(t, s->mb_x, s->mb_y, j, mv_x, mv_y, add);
|
||||
} else {
|
||||
s->dsp.clear_block(t->block);
|
||||
decode_block_intra(t, t->block);
|
||||
@@ -266,6 +273,8 @@ static int decode_frame(AVCodecContext *avctx,
|
||||
avcodec_set_dimensions(avctx, s->width, s->height);
|
||||
if (t->frame.data[0])
|
||||
avctx->release_buffer(avctx, &t->frame);
|
||||
if (t->last_frame.data[0])
|
||||
avctx->release_buffer(avctx, &t->last_frame);
|
||||
}
|
||||
|
||||
t->frame.reference = 1;
|
||||
@@ -280,6 +289,7 @@ static int decode_frame(AVCodecContext *avctx,
|
||||
if (!t->bitstream_buf)
|
||||
return AVERROR(ENOMEM);
|
||||
bswap16_buf(t->bitstream_buf, (const uint16_t*)buf, (buf_end-buf)/2);
|
||||
memset((uint8_t*)t->bitstream_buf + (buf_end-buf), 0, FF_INPUT_BUFFER_PADDING_SIZE);
|
||||
init_get_bits(&s->gb, t->bitstream_buf, 8*(buf_end-buf));
|
||||
|
||||
for (s->mb_y=0; s->mb_y < (avctx->height+15)/16; s->mb_y++)
|
||||
|
@@ -74,7 +74,7 @@ static int unpack(const uint8_t *src, const uint8_t *src_end, unsigned char *dst
|
||||
else
|
||||
src += 2;
|
||||
|
||||
if (src+3>src_end)
|
||||
if (src_end - src < 3)
|
||||
return -1;
|
||||
size = AV_RB24(src);
|
||||
src += 3;
|
||||
@@ -138,7 +138,7 @@ static int unpack(const uint8_t *src, const uint8_t *src_end, unsigned char *dst
|
||||
* @return 0 on success, -1 on critical buffer underflow
|
||||
*/
|
||||
static int tgv_decode_inter(TgvContext * s, const uint8_t *buf, const uint8_t *buf_end){
|
||||
unsigned char *frame0_end = s->last_frame.data[0] + s->avctx->width*s->last_frame.linesize[0];
|
||||
unsigned last_frame_size = s->avctx->height*s->last_frame.linesize[0];
|
||||
int num_mvs;
|
||||
int num_blocks_raw;
|
||||
int num_blocks_packed;
|
||||
@@ -148,7 +148,7 @@ static int tgv_decode_inter(TgvContext * s, const uint8_t *buf, const uint8_t *b
|
||||
int mvbits;
|
||||
const unsigned char *blocks_raw;
|
||||
|
||||
if(buf+12>buf_end)
|
||||
if(buf_end - buf < 12)
|
||||
return -1;
|
||||
|
||||
num_mvs = AV_RL16(&buf[0]);
|
||||
@@ -171,7 +171,7 @@ static int tgv_decode_inter(TgvContext * s, const uint8_t *buf, const uint8_t *b
|
||||
/* read motion vectors */
|
||||
mvbits = (num_mvs*2*10+31) & ~31;
|
||||
|
||||
if (buf+(mvbits>>3)+16*num_blocks_raw+8*num_blocks_packed>buf_end)
|
||||
if (buf_end - buf < (mvbits>>3)+16*num_blocks_raw+8*num_blocks_packed)
|
||||
return -1;
|
||||
|
||||
init_get_bits(&gb, buf, mvbits);
|
||||
@@ -207,12 +207,14 @@ static int tgv_decode_inter(TgvContext * s, const uint8_t *buf, const uint8_t *b
|
||||
int src_stride;
|
||||
|
||||
if (vector < num_mvs) {
|
||||
src = s->last_frame.data[0] +
|
||||
(y*4 + s->mv_codebook[vector][1])*s->last_frame.linesize[0] +
|
||||
x*4 + s->mv_codebook[vector][0];
|
||||
unsigned offset =
|
||||
(y*4 + s->mv_codebook[vector][1])*s->last_frame.linesize[0] +
|
||||
x*4 + s->mv_codebook[vector][0];
|
||||
|
||||
src_stride = s->last_frame.linesize[0];
|
||||
if (src+3*src_stride+3>=frame0_end)
|
||||
if (offset >= last_frame_size - (3*src_stride+3))
|
||||
continue;
|
||||
src = s->last_frame.data[0] + offset;
|
||||
}else{
|
||||
int offset = vector - num_mvs;
|
||||
if (offset<num_blocks_raw)
|
||||
@@ -252,12 +254,15 @@ static int tgv_decode_frame(AVCodecContext *avctx,
|
||||
const uint8_t *buf_end = buf + buf_size;
|
||||
int chunk_type;
|
||||
|
||||
if (buf_end - buf < EA_PREAMBLE_SIZE)
|
||||
return AVERROR_INVALIDDATA;
|
||||
|
||||
chunk_type = AV_RL32(&buf[0]);
|
||||
buf += EA_PREAMBLE_SIZE;
|
||||
|
||||
if (chunk_type==kVGT_TAG) {
|
||||
int pal_count, i;
|
||||
if(buf+12>buf_end) {
|
||||
if(buf_end - buf < 12) {
|
||||
av_log(avctx, AV_LOG_WARNING, "truncated header\n");
|
||||
return -1;
|
||||
}
|
||||
@@ -272,7 +277,7 @@ static int tgv_decode_frame(AVCodecContext *avctx,
|
||||
|
||||
pal_count = AV_RL16(&buf[6]);
|
||||
buf += 12;
|
||||
for(i=0; i<pal_count && i<AVPALETTE_COUNT && buf+2<buf_end; i++) {
|
||||
for(i=0; i<pal_count && i<AVPALETTE_COUNT && buf_end - buf >= 3; i++) {
|
||||
s->palette[i] = AV_RB24(buf);
|
||||
buf += 3;
|
||||
}
|
||||
|
@@ -75,6 +75,20 @@ static inline int get_ue_golomb(GetBitContext *gb){
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Read an unsigned Exp-Golomb code in the range 0 to UINT32_MAX-1.
|
||||
*/
|
||||
static inline unsigned get_ue_golomb_long(GetBitContext *gb)
|
||||
{
|
||||
unsigned buf, log;
|
||||
|
||||
buf = show_bits_long(gb, 32);
|
||||
log = 31 - av_log2(buf);
|
||||
skip_bits_long(gb, log);
|
||||
|
||||
return get_bits_long(gb, log + 1) - 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* read unsigned exp golomb code, constraint to a max of 31.
|
||||
* the return value is undefined if the stored value exceeds 31.
|
||||
|
@@ -1019,8 +1019,12 @@ static av_cold void common_init(H264Context *h){
|
||||
s->height = s->avctx->height;
|
||||
s->codec_id= s->avctx->codec->id;
|
||||
|
||||
ff_h264dsp_init(&h->h264dsp, 8);
|
||||
ff_h264_pred_init(&h->hpc, s->codec_id, 8);
|
||||
s->avctx->bits_per_raw_sample = 8;
|
||||
|
||||
ff_h264dsp_init(&h->h264dsp,
|
||||
s->avctx->bits_per_raw_sample);
|
||||
ff_h264_pred_init(&h->hpc, s->codec_id,
|
||||
s->avctx->bits_per_raw_sample);
|
||||
|
||||
h->dequant_coeff_pps= -1;
|
||||
s->unrestricted_mv=1;
|
||||
@@ -2633,6 +2637,7 @@ static int decode_slice_header(H264Context *h, H264Context *h0){
|
||||
free_tables(h, 0);
|
||||
flush_dpb(s->avctx);
|
||||
MPV_common_end(s);
|
||||
h->list_count = 0;
|
||||
}
|
||||
if (!s->context_initialized) {
|
||||
if (h != h0) {
|
||||
@@ -3753,9 +3758,13 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){
|
||||
switch (hx->nal_unit_type) {
|
||||
case NAL_SPS:
|
||||
case NAL_PPS:
|
||||
nals_needed = nal_index;
|
||||
break;
|
||||
case NAL_IDR_SLICE:
|
||||
case NAL_SLICE:
|
||||
nals_needed = nal_index;
|
||||
init_get_bits(&hx->s.gb, ptr, bit_length);
|
||||
if(!get_ue_golomb(&hx->s.gb))
|
||||
nals_needed = nal_index;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
@@ -227,7 +227,7 @@ typedef struct PPS{
|
||||
int transform_8x8_mode; ///< transform_8x8_mode_flag
|
||||
uint8_t scaling_matrix4[6][16];
|
||||
uint8_t scaling_matrix8[6][64];
|
||||
uint8_t chroma_qp_table[2][64]; ///< pre-scaled (with chroma_qp_index_offset) version of qp_table
|
||||
uint8_t chroma_qp_table[2][QP_MAX_NUM+1]; ///< pre-scaled (with chroma_qp_index_offset) version of qp_table
|
||||
int chroma_qp_diff;
|
||||
}PPS;
|
||||
|
||||
|
@@ -89,7 +89,8 @@ static void fill_colmap(H264Context *h, int map[2][16+32], int list, int field,
|
||||
for(j=start; j<end; j++){
|
||||
if(4*h->ref_list[0][j].frame_num + (h->ref_list[0][j].reference&3) == poc){
|
||||
int cur_ref= mbafi ? (j-16)^field : j;
|
||||
map[list][2*old_ref + (rfield^field) + 16] = cur_ref;
|
||||
if(ref1->mbaff)
|
||||
map[list][2*old_ref + (rfield^field) + 16] = cur_ref;
|
||||
if(rfield == field || !interl)
|
||||
map[list][old_ref] = cur_ref;
|
||||
break;
|
||||
@@ -252,6 +253,10 @@ static void pred_spatial_direct_motion(H264Context * const h, int *mb_type){
|
||||
mb_type_col[1] = h->ref_list[1][0].mb_type[mb_xy + s->mb_stride];
|
||||
b8_stride = 2+4*s->mb_stride;
|
||||
b4_stride *= 6;
|
||||
if(IS_INTERLACED(mb_type_col[0]) != IS_INTERLACED(mb_type_col[1])){
|
||||
mb_type_col[0] &= ~MB_TYPE_INTERLACED;
|
||||
mb_type_col[1] &= ~MB_TYPE_INTERLACED;
|
||||
}
|
||||
|
||||
sub_mb_type |= MB_TYPE_16x16|MB_TYPE_DIRECT2; /* B_SUB_8x8 */
|
||||
if( (mb_type_col[0] & MB_TYPE_16x16_OR_INTRA)
|
||||
|
@@ -143,8 +143,8 @@ static inline int decode_hrd_parameters(H264Context *h, SPS *sps){
|
||||
get_bits(&s->gb, 4); /* bit_rate_scale */
|
||||
get_bits(&s->gb, 4); /* cpb_size_scale */
|
||||
for(i=0; i<cpb_count; i++){
|
||||
get_ue_golomb(&s->gb); /* bit_rate_value_minus1 */
|
||||
get_ue_golomb(&s->gb); /* cpb_size_value_minus1 */
|
||||
get_ue_golomb_long(&s->gb); /* bit_rate_value_minus1 */
|
||||
get_ue_golomb_long(&s->gb); /* cpb_size_value_minus1 */
|
||||
get_bits1(&s->gb); /* cbr_flag */
|
||||
}
|
||||
sps->initial_cpb_removal_delay_length = get_bits(&s->gb, 5) + 1;
|
||||
|
@@ -40,7 +40,7 @@
|
||||
#undef BIT_DEPTH
|
||||
|
||||
static void pred4x4_vertical_vp8_c(uint8_t *src, const uint8_t *topright, int stride){
|
||||
const int lt= src[-1-1*stride];
|
||||
const unsigned lt = src[-1-1*stride];
|
||||
LOAD_TOP_EDGE
|
||||
LOAD_TOP_RIGHT_EDGE
|
||||
uint32_t v = PACK_4U8((lt + 2*t0 + t1 + 2) >> 2,
|
||||
@@ -55,7 +55,7 @@ static void pred4x4_vertical_vp8_c(uint8_t *src, const uint8_t *topright, int st
|
||||
}
|
||||
|
||||
static void pred4x4_horizontal_vp8_c(uint8_t *src, const uint8_t *topright, int stride){
|
||||
const int lt= src[-1-1*stride];
|
||||
const unsigned lt = src[-1-1*stride];
|
||||
LOAD_LEFT_EDGE
|
||||
|
||||
AV_WN32A(src+0*stride, ((lt + 2*l0 + l1 + 2) >> 2)*0x01010101);
|
||||
@@ -292,7 +292,7 @@ static void pred16x16_tm_vp8_c(uint8_t *src, int stride){
|
||||
|
||||
static void pred8x8_left_dc_rv40_c(uint8_t *src, int stride){
|
||||
int i;
|
||||
int dc0;
|
||||
unsigned dc0;
|
||||
|
||||
dc0=0;
|
||||
for(i=0;i<8; i++)
|
||||
@@ -307,7 +307,7 @@ static void pred8x8_left_dc_rv40_c(uint8_t *src, int stride){
|
||||
|
||||
static void pred8x8_top_dc_rv40_c(uint8_t *src, int stride){
|
||||
int i;
|
||||
int dc0;
|
||||
unsigned dc0;
|
||||
|
||||
dc0=0;
|
||||
for(i=0;i<8; i++)
|
||||
@@ -322,7 +322,7 @@ static void pred8x8_top_dc_rv40_c(uint8_t *src, int stride){
|
||||
|
||||
static void pred8x8_dc_rv40_c(uint8_t *src, int stride){
|
||||
int i;
|
||||
int dc0=0;
|
||||
unsigned dc0 = 0;
|
||||
|
||||
for(i=0;i<4; i++){
|
||||
dc0+= src[-1+i*stride] + src[i-stride];
|
||||
|
@@ -120,28 +120,28 @@ static void FUNCC(pred4x4_129_dc)(uint8_t *_src, const uint8_t *topright, int _s
|
||||
|
||||
|
||||
#define LOAD_TOP_RIGHT_EDGE\
|
||||
const int av_unused t4= topright[0];\
|
||||
const int av_unused t5= topright[1];\
|
||||
const int av_unused t6= topright[2];\
|
||||
const int av_unused t7= topright[3];\
|
||||
const unsigned av_unused t4 = topright[0];\
|
||||
const unsigned av_unused t5 = topright[1];\
|
||||
const unsigned av_unused t6 = topright[2];\
|
||||
const unsigned av_unused t7 = topright[3];\
|
||||
|
||||
#define LOAD_DOWN_LEFT_EDGE\
|
||||
const int av_unused l4= src[-1+4*stride];\
|
||||
const int av_unused l5= src[-1+5*stride];\
|
||||
const int av_unused l6= src[-1+6*stride];\
|
||||
const int av_unused l7= src[-1+7*stride];\
|
||||
const unsigned av_unused l4 = src[-1+4*stride];\
|
||||
const unsigned av_unused l5 = src[-1+5*stride];\
|
||||
const unsigned av_unused l6 = src[-1+6*stride];\
|
||||
const unsigned av_unused l7 = src[-1+7*stride];\
|
||||
|
||||
#define LOAD_LEFT_EDGE\
|
||||
const int av_unused l0= src[-1+0*stride];\
|
||||
const int av_unused l1= src[-1+1*stride];\
|
||||
const int av_unused l2= src[-1+2*stride];\
|
||||
const int av_unused l3= src[-1+3*stride];\
|
||||
const unsigned av_unused l0 = src[-1+0*stride];\
|
||||
const unsigned av_unused l1 = src[-1+1*stride];\
|
||||
const unsigned av_unused l2 = src[-1+2*stride];\
|
||||
const unsigned av_unused l3 = src[-1+3*stride];\
|
||||
|
||||
#define LOAD_TOP_EDGE\
|
||||
const int av_unused t0= src[ 0-1*stride];\
|
||||
const int av_unused t1= src[ 1-1*stride];\
|
||||
const int av_unused t2= src[ 2-1*stride];\
|
||||
const int av_unused t3= src[ 3-1*stride];\
|
||||
const unsigned av_unused t0 = src[ 0-1*stride];\
|
||||
const unsigned av_unused t1 = src[ 1-1*stride];\
|
||||
const unsigned av_unused t2 = src[ 2-1*stride];\
|
||||
const unsigned av_unused t3 = src[ 3-1*stride];\
|
||||
|
||||
static void FUNCC(pred4x4_down_right)(uint8_t *_src, const uint8_t *topright, int _stride){
|
||||
pixel *src = (pixel*)_src;
|
||||
|
@@ -104,10 +104,15 @@ static VLC_TYPE vlc_tables[VLC_TABLES_SIZE][2];
|
||||
|
||||
static av_cold int imc_decode_init(AVCodecContext * avctx)
|
||||
{
|
||||
int i, j;
|
||||
int i, j, ret;
|
||||
IMCContext *q = avctx->priv_data;
|
||||
double r1, r2;
|
||||
|
||||
if (avctx->channels != 1) {
|
||||
av_log_ask_for_sample(avctx, "Number of channels is not supported\n");
|
||||
return AVERROR_PATCHWELCOME;
|
||||
}
|
||||
|
||||
q->decoder_reset = 1;
|
||||
|
||||
for(i = 0; i < BANDS; i++)
|
||||
@@ -156,7 +161,10 @@ static av_cold int imc_decode_init(AVCodecContext * avctx)
|
||||
}
|
||||
q->one_div_log2 = 1/log(2);
|
||||
|
||||
ff_fft_init(&q->fft, 7, 1);
|
||||
if ((ret = ff_fft_init(&q->fft, 7, 1))) {
|
||||
av_log(avctx, AV_LOG_INFO, "FFT init failed\n");
|
||||
return ret;
|
||||
}
|
||||
dsputil_init(&q->dsp, avctx);
|
||||
avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
|
||||
avctx->channel_layout = (avctx->channels==2) ? AV_CH_LAYOUT_STEREO : AV_CH_LAYOUT_MONO;
|
||||
|
@@ -470,6 +470,16 @@ int avpicture_layout(const AVPicture* src, enum PixelFormat pix_fmt, int width,
|
||||
}
|
||||
}
|
||||
|
||||
switch (pix_fmt) {
|
||||
case PIX_FMT_RGB8:
|
||||
case PIX_FMT_BGR8:
|
||||
case PIX_FMT_RGB4_BYTE:
|
||||
case PIX_FMT_BGR4_BYTE:
|
||||
case PIX_FMT_GRAY8:
|
||||
// do not include palette for these pseudo-paletted formats
|
||||
return size;
|
||||
}
|
||||
|
||||
if (desc->flags & PIX_FMT_PAL)
|
||||
memcpy((unsigned char *)(((size_t)dest + 3) & ~3), src->data[1], 256 * 4);
|
||||
|
||||
|
@@ -141,18 +141,25 @@ static int libgsm_decode_frame(AVCodecContext *avctx,
|
||||
AVPacket *avpkt) {
|
||||
const uint8_t *buf = avpkt->data;
|
||||
int buf_size = avpkt->size;
|
||||
int out_size = avctx->frame_size * av_get_bytes_per_sample(avctx->sample_fmt);
|
||||
|
||||
if (*data_size < out_size) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Output buffer is too small\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
*data_size = 0; /* In case of error */
|
||||
if(buf_size < avctx->block_align) return -1;
|
||||
switch(avctx->codec_id) {
|
||||
case CODEC_ID_GSM:
|
||||
if(gsm_decode(avctx->priv_data,buf,data)) return -1;
|
||||
*data_size = GSM_FRAME_SIZE*sizeof(int16_t);
|
||||
break;
|
||||
case CODEC_ID_GSM_MS:
|
||||
if(gsm_decode(avctx->priv_data,buf,data) ||
|
||||
gsm_decode(avctx->priv_data,buf+33,((int16_t*)data)+GSM_FRAME_SIZE)) return -1;
|
||||
*data_size = GSM_FRAME_SIZE*sizeof(int16_t)*2;
|
||||
}
|
||||
|
||||
*data_size = out_size;
|
||||
return avctx->block_align;
|
||||
}
|
||||
|
||||
|
@@ -101,13 +101,14 @@ static int encode_nals(AVCodecContext *ctx, uint8_t *buf, int size,
|
||||
}
|
||||
|
||||
static int X264_frame(AVCodecContext *ctx, uint8_t *buf,
|
||||
int bufsize, void *data)
|
||||
int orig_bufsize, void *data)
|
||||
{
|
||||
X264Context *x4 = ctx->priv_data;
|
||||
AVFrame *frame = data;
|
||||
x264_nal_t *nal;
|
||||
int nnal, i;
|
||||
x264_picture_t pic_out;
|
||||
int bufsize;
|
||||
|
||||
x264_picture_init( &x4->pic );
|
||||
x4->pic.img.i_csp = X264_CSP_I420;
|
||||
@@ -138,6 +139,7 @@ static int X264_frame(AVCodecContext *ctx, uint8_t *buf,
|
||||
}
|
||||
|
||||
do {
|
||||
bufsize = orig_bufsize;
|
||||
if (x264_encoder_encode(x4->enc, &nal, &nnal, frame? &x4->pic: NULL, &pic_out) < 0)
|
||||
return -1;
|
||||
|
||||
|
@@ -950,7 +950,12 @@ static int output_data_internal(MLPDecodeContext *m, unsigned int substr,
|
||||
int32_t *data_32 = (int32_t*) data;
|
||||
int16_t *data_16 = (int16_t*) data;
|
||||
|
||||
if (*data_size < (s->max_channel + 1) * s->blockpos * (is32 ? 4 : 2))
|
||||
if (m->avctx->channels != s->max_matrix_channel + 1) {
|
||||
av_log(m->avctx, AV_LOG_ERROR, "channel count mismatch\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
if (*data_size < m->avctx->channels * s->blockpos * (is32 ? 4 : 2))
|
||||
return -1;
|
||||
|
||||
for (i = 0; i < s->blockpos; i++) {
|
||||
|
@@ -1040,7 +1040,7 @@ void ff_estimate_p_frame_motion(MpegEncContext * s,
|
||||
/* intra / predictive decision */
|
||||
pix = c->src[0][0];
|
||||
sum = s->dsp.pix_sum(pix, s->linesize);
|
||||
varc = s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500;
|
||||
varc = s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)sum*sum)>>8) + 500;
|
||||
|
||||
pic->mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
|
||||
pic->mb_var [s->mb_stride * mb_y + mb_x] = (varc+128)>>8;
|
||||
@@ -1202,7 +1202,7 @@ void ff_estimate_p_frame_motion(MpegEncContext * s,
|
||||
if((c->avctx->mb_cmp&0xFF)==FF_CMP_SSE){
|
||||
intra_score= varc - 500;
|
||||
}else{
|
||||
int mean= (sum+128)>>8;
|
||||
unsigned mean = (sum+128)>>8;
|
||||
mean*= 0x01010101;
|
||||
|
||||
for(i=0; i<16; i++){
|
||||
|
@@ -197,12 +197,19 @@ static int mpc7_decode_frame(AVCodecContext * avctx,
|
||||
int i, ch;
|
||||
int mb = -1;
|
||||
Band *bands = c->bands;
|
||||
int off;
|
||||
int off, out_size;
|
||||
int bits_used, bits_avail;
|
||||
|
||||
memset(bands, 0, sizeof(bands));
|
||||
if(buf_size <= 4){
|
||||
av_log(avctx, AV_LOG_ERROR, "Too small buffer passed (%i bytes)\n", buf_size);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
out_size = (buf[1] ? c->lastframelen : MPC_FRAME_SIZE) * 4;
|
||||
if (*data_size < out_size) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Output buffer is too small\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
bits = av_malloc(((buf_size - 1) & ~3) + FF_INPUT_BUFFER_PADDING_SIZE);
|
||||
@@ -277,7 +284,7 @@ static int mpc7_decode_frame(AVCodecContext * avctx,
|
||||
*data_size = 0;
|
||||
return buf_size;
|
||||
}
|
||||
*data_size = (buf[1] ? c->lastframelen : MPC_FRAME_SIZE) * 4;
|
||||
*data_size = out_size;
|
||||
|
||||
return buf_size;
|
||||
}
|
||||
|
@@ -243,10 +243,16 @@ static int mpc8_decode_frame(AVCodecContext * avctx,
|
||||
GetBitContext gb2, *gb = &gb2;
|
||||
int i, j, k, ch, cnt, res, t;
|
||||
Band *bands = c->bands;
|
||||
int off;
|
||||
int off, out_size;
|
||||
int maxband, keyframe;
|
||||
int last[2];
|
||||
|
||||
out_size = MPC_FRAME_SIZE * 2 * avctx->channels;
|
||||
if (*data_size < out_size) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Output buffer is too small\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
keyframe = c->cur_frame == 0;
|
||||
|
||||
if(keyframe){
|
||||
@@ -404,7 +410,7 @@ static int mpc8_decode_frame(AVCodecContext * avctx,
|
||||
c->last_bits_used = get_bits_count(gb);
|
||||
if(c->cur_frame >= c->frames)
|
||||
c->cur_frame = 0;
|
||||
*data_size = MPC_FRAME_SIZE * 2 * avctx->channels;
|
||||
*data_size = out_size;
|
||||
|
||||
return c->cur_frame ? c->last_bits_used >> 3 : buf_size;
|
||||
}
|
||||
|
@@ -1801,8 +1801,8 @@ static int decode_frame(AVCodecContext * avctx,
|
||||
avctx->bit_rate = s->bit_rate;
|
||||
avctx->sub_id = s->layer;
|
||||
|
||||
if(*data_size < 1152*avctx->channels*sizeof(OUT_INT))
|
||||
return -1;
|
||||
if (*data_size < avctx->frame_size * avctx->channels * sizeof(OUT_INT))
|
||||
return AVERROR(EINVAL);
|
||||
*data_size = 0;
|
||||
|
||||
if(s->frame_size<=0 || s->frame_size > buf_size){
|
||||
@@ -1870,6 +1870,9 @@ static int decode_frame_adu(AVCodecContext * avctx,
|
||||
avctx->bit_rate = s->bit_rate;
|
||||
avctx->sub_id = s->layer;
|
||||
|
||||
if (*data_size < avctx->frame_size * avctx->channels * sizeof(OUT_INT))
|
||||
return AVERROR(EINVAL);
|
||||
|
||||
s->frame_size = len;
|
||||
|
||||
if (avctx->parse_only) {
|
||||
|
@@ -2302,12 +2302,15 @@ void ff_draw_horiz_band(MpegEncContext *s, int y, int h){
|
||||
|
||||
edge_h= FFMIN(h, s->v_edge_pos - y);
|
||||
|
||||
s->dsp.draw_edges(s->current_picture_ptr->data[0] + y *s->linesize , s->linesize,
|
||||
s->h_edge_pos , edge_h , EDGE_WIDTH , EDGE_WIDTH , sides);
|
||||
s->dsp.draw_edges(s->current_picture_ptr->data[1] + (y>>vshift)*s->uvlinesize, s->uvlinesize,
|
||||
s->h_edge_pos>>hshift, edge_h>>hshift, EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, sides);
|
||||
s->dsp.draw_edges(s->current_picture_ptr->data[2] + (y>>vshift)*s->uvlinesize, s->uvlinesize,
|
||||
s->h_edge_pos>>hshift, edge_h>>hshift, EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, sides);
|
||||
s->dsp.draw_edges(s->current_picture_ptr->data[0] + y *s->linesize,
|
||||
s->linesize, s->h_edge_pos, edge_h,
|
||||
EDGE_WIDTH, EDGE_WIDTH, sides);
|
||||
s->dsp.draw_edges(s->current_picture_ptr->data[1] + (y>>vshift)*s->uvlinesize,
|
||||
s->uvlinesize, s->h_edge_pos>>hshift, edge_h>>vshift,
|
||||
EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, sides);
|
||||
s->dsp.draw_edges(s->current_picture_ptr->data[2] + (y>>vshift)*s->uvlinesize,
|
||||
s->uvlinesize, s->h_edge_pos>>hshift, edge_h>>vshift,
|
||||
EDGE_WIDTH>>hshift, EDGE_WIDTH>>vshift, sides);
|
||||
}
|
||||
|
||||
h= FFMIN(h, s->avctx->height - y);
|
||||
|
@@ -725,7 +725,7 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s,
|
||||
0, 0, 0,
|
||||
ref_picture, pix_op, qpix_op,
|
||||
s->mv[dir][0][0], s->mv[dir][0][1], 16);
|
||||
}else if(!is_mpeg12 && (CONFIG_WMV2_DECODER || CONFIG_WMV2_ENCODER) && s->mspel){
|
||||
}else if(!is_mpeg12 && (CONFIG_WMV2_DECODER || CONFIG_WMV2_ENCODER) && s->mspel && s->codec_id == CODEC_ID_WMV2){
|
||||
ff_mspel_motion(s, dest_y, dest_cb, dest_cr,
|
||||
ref_picture, pix_op,
|
||||
s->mv[dir][0][0], s->mv[dir][0][1], 16);
|
||||
|
@@ -973,7 +973,7 @@ static int estimate_best_b_count(MpegEncContext *s){
|
||||
c->time_base= s->avctx->time_base;
|
||||
c->max_b_frames= s->max_b_frames;
|
||||
|
||||
if (avcodec_open(c, codec) < 0)
|
||||
if (avcodec_open2(c, codec, NULL) < 0)
|
||||
return -1;
|
||||
|
||||
for(i=0; i<s->max_b_frames+2; i++){
|
||||
@@ -2007,7 +2007,7 @@ static int mb_var_thread(AVCodecContext *c, void *arg){
|
||||
int varc;
|
||||
int sum = s->dsp.pix_sum(pix, s->linesize);
|
||||
|
||||
varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)(sum*sum))>>8) + 500 + 128)>>8;
|
||||
varc = (s->dsp.pix_norm1(pix, s->linesize) - (((unsigned)sum*sum)>>8) + 500 + 128)>>8;
|
||||
|
||||
s->current_picture.mb_var [s->mb_stride * mb_y + mb_x] = varc;
|
||||
s->current_picture.mb_mean[s->mb_stride * mb_y + mb_x] = (sum+128)>>8;
|
||||
|
@@ -20,6 +20,7 @@
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include "libavutil/bswap.h"
|
||||
#include "libavutil/lzo.h"
|
||||
@@ -112,19 +113,23 @@ static int codec_reinit(AVCodecContext *avctx, int width, int height, int qualit
|
||||
if (quality >= 0)
|
||||
get_quant_quality(c, quality);
|
||||
if (width != c->width || height != c->height) {
|
||||
if (av_image_check_size(height, width, 0, avctx) < 0)
|
||||
return 0;
|
||||
// also reserve space for a possible additional header
|
||||
int buf_size = 24 + height * width * 3 / 2 + AV_LZO_OUTPUT_PADDING;
|
||||
if (av_image_check_size(height, width, 0, avctx) < 0 ||
|
||||
buf_size > INT_MAX/8)
|
||||
return -1;
|
||||
avctx->width = c->width = width;
|
||||
avctx->height = c->height = height;
|
||||
av_fast_malloc(&c->decomp_buf, &c->decomp_size, c->height * c->width * 3 / 2);
|
||||
av_fast_malloc(&c->decomp_buf, &c->decomp_size, buf_size);
|
||||
if (!c->decomp_buf) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Can't allocate decompression buffer.\n");
|
||||
return 0;
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
rtjpeg_decode_init(&c->rtj, &c->dsp, c->width, c->height, c->lq, c->cq);
|
||||
return 1;
|
||||
} else if (quality != c->quality)
|
||||
rtjpeg_decode_init(&c->rtj, &c->dsp, c->width, c->height, c->lq, c->cq);
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,
|
||||
@@ -135,6 +140,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,
|
||||
AVFrame *picture = data;
|
||||
int orig_size = buf_size;
|
||||
int keyframe;
|
||||
int size_change = 0;
|
||||
int result;
|
||||
enum {NUV_UNCOMPRESSED = '0', NUV_RTJPEG = '1',
|
||||
NUV_RTJPEG_IN_LZO = '2', NUV_LZO = '3',
|
||||
@@ -172,18 +178,19 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,
|
||||
default:
|
||||
keyframe = 1; break;
|
||||
}
|
||||
retry:
|
||||
// skip rest of the frameheader.
|
||||
buf = &buf[12];
|
||||
buf_size -= 12;
|
||||
if (comptype == NUV_RTJPEG_IN_LZO || comptype == NUV_LZO) {
|
||||
int outlen = c->decomp_size, inlen = buf_size;
|
||||
int outlen = c->decomp_size - AV_LZO_OUTPUT_PADDING, inlen = buf_size;
|
||||
if (av_lzo1x_decode(c->decomp_buf, &outlen, buf, &inlen))
|
||||
av_log(avctx, AV_LOG_ERROR, "error during lzo decompression\n");
|
||||
buf = c->decomp_buf;
|
||||
buf_size = c->decomp_size;
|
||||
buf_size = c->decomp_size - AV_LZO_OUTPUT_PADDING;
|
||||
}
|
||||
if (c->codec_frameheader) {
|
||||
int w, h, q;
|
||||
int w, h, q, res;
|
||||
if (buf_size < 12) {
|
||||
av_log(avctx, AV_LOG_ERROR, "invalid nuv video frame\n");
|
||||
return -1;
|
||||
@@ -191,13 +198,20 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,
|
||||
w = AV_RL16(&buf[6]);
|
||||
h = AV_RL16(&buf[8]);
|
||||
q = buf[10];
|
||||
if (!codec_reinit(avctx, w, h, q))
|
||||
return -1;
|
||||
res = codec_reinit(avctx, w, h, q);
|
||||
if (res < 0)
|
||||
return res;
|
||||
if (res) {
|
||||
buf = avpkt->data;
|
||||
buf_size = avpkt->size;
|
||||
size_change = 1;
|
||||
goto retry;
|
||||
}
|
||||
buf = &buf[12];
|
||||
buf_size -= 12;
|
||||
}
|
||||
|
||||
if (keyframe && c->pic.data[0])
|
||||
if ((size_change || keyframe) && c->pic.data[0])
|
||||
avctx->release_buffer(avctx, &c->pic);
|
||||
c->pic.reference = 3;
|
||||
c->pic.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_READABLE |
|
||||
@@ -259,7 +273,7 @@ static av_cold int decode_init(AVCodecContext *avctx) {
|
||||
if (avctx->extradata_size)
|
||||
get_quant(avctx, c, avctx->extradata, avctx->extradata_size);
|
||||
dsputil_init(&c->dsp, avctx);
|
||||
if (!codec_reinit(avctx, avctx->width, avctx->height, -1))
|
||||
if (codec_reinit(avctx, avctx->width, avctx->height, -1) < 0)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
@@ -471,7 +471,8 @@ static int decode_frame(AVCodecContext *avctx,
|
||||
avctx->pix_fmt = PIX_FMT_MONOBLACK;
|
||||
} else if (s->color_type == PNG_COLOR_TYPE_PALETTE) {
|
||||
avctx->pix_fmt = PIX_FMT_PAL8;
|
||||
} else if (s->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
|
||||
} else if (s->bit_depth == 8 &&
|
||||
s->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
|
||||
avctx->pix_fmt = PIX_FMT_GRAY8A;
|
||||
} else {
|
||||
goto fail;
|
||||
|
@@ -332,6 +332,9 @@ static int update_context_from_thread(AVCodecContext *dst, AVCodecContext *src,
|
||||
dst->height = src->height;
|
||||
dst->pix_fmt = src->pix_fmt;
|
||||
|
||||
dst->coded_width = src->coded_width;
|
||||
dst->coded_height = src->coded_height;
|
||||
|
||||
dst->has_b_frames = src->has_b_frames;
|
||||
dst->idct_algo = src->idct_algo;
|
||||
dst->slice_count = src->slice_count;
|
||||
|
@@ -100,7 +100,8 @@ static inline void flush_put_bits(PutBitContext *s)
|
||||
align_put_bits(s);
|
||||
#else
|
||||
#ifndef BITSTREAM_WRITER_LE
|
||||
s->bit_buf<<= s->bit_left;
|
||||
if (s->bit_left < 32)
|
||||
s->bit_buf<<= s->bit_left;
|
||||
#endif
|
||||
while (s->bit_left < 32) {
|
||||
/* XXX: should test end of buffer */
|
||||
|
@@ -738,11 +738,17 @@ static int qcelp_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
|
||||
int buf_size = avpkt->size;
|
||||
QCELPContext *q = avctx->priv_data;
|
||||
float *outbuffer = data;
|
||||
int i;
|
||||
int i, out_size;
|
||||
float quantized_lspf[10], lpc[10];
|
||||
float gain[16];
|
||||
float *formant_mem;
|
||||
|
||||
out_size = 160 * av_get_bytes_per_sample(avctx->sample_fmt);
|
||||
if (*data_size < out_size) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Output buffer is too small\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
if((q->bitrate = determine_bitrate(avctx, buf_size, &buf)) == I_F_Q)
|
||||
{
|
||||
warn_insufficient_frame_quality(avctx, "bitrate cannot be determined.");
|
||||
@@ -837,7 +843,7 @@ erasure:
|
||||
memcpy(q->prev_lspf, quantized_lspf, sizeof(q->prev_lspf));
|
||||
q->prev_bitrate = q->bitrate;
|
||||
|
||||
*data_size = 160 * sizeof(*outbuffer);
|
||||
*data_size = out_size;
|
||||
|
||||
return buf_size;
|
||||
}
|
||||
|
@@ -76,6 +76,7 @@ do { \
|
||||
#define SAMPLES_NEEDED_2(why) \
|
||||
av_log (NULL,AV_LOG_INFO,"This file triggers some missing code. Please contact the developers.\nPosition: %s\n",why);
|
||||
|
||||
#define QDM2_MAX_FRAME_SIZE 512
|
||||
|
||||
typedef int8_t sb_int8_array[2][30][64];
|
||||
|
||||
@@ -168,7 +169,7 @@ typedef struct {
|
||||
/// I/O data
|
||||
const uint8_t *compressed_data;
|
||||
int compressed_size;
|
||||
float output_buffer[1024];
|
||||
float output_buffer[QDM2_MAX_FRAME_SIZE * MPA_MAX_CHANNELS * 2];
|
||||
|
||||
/// Synthesis filter
|
||||
MPADSPContext mpadsp;
|
||||
@@ -1327,7 +1328,7 @@ static void qdm2_fft_decode_tones (QDM2Context *q, int duration, GetBitContext *
|
||||
local_int_10 = 1 << (q->group_order - duration - 1);
|
||||
offset = 1;
|
||||
|
||||
while (1) {
|
||||
while (get_bits_left(gb)>0) {
|
||||
if (q->superblocktype_2_3) {
|
||||
while ((n = qdm2_get_vlc(gb, &vlc_tab_fft_tone_offset[local_int_8], 1, 2)) < 2) {
|
||||
offset = 1;
|
||||
@@ -1822,7 +1823,8 @@ static av_cold int qdm2_decode_init(AVCodecContext *avctx)
|
||||
// something like max decodable tones
|
||||
s->group_order = av_log2(s->group_size) + 1;
|
||||
s->frame_size = s->group_size / 16; // 16 iterations per super block
|
||||
if (s->frame_size > FF_ARRAY_ELEMS(s->output_buffer) / 2)
|
||||
|
||||
if (s->frame_size > QDM2_MAX_FRAME_SIZE)
|
||||
return AVERROR_INVALIDDATA;
|
||||
|
||||
s->sub_sampling = s->fft_order - 7;
|
||||
@@ -1893,6 +1895,9 @@ static int qdm2_decode (QDM2Context *q, const uint8_t *in, int16_t *out)
|
||||
int ch, i;
|
||||
const int frame_size = (q->frame_size * q->channels);
|
||||
|
||||
if((unsigned)frame_size > FF_ARRAY_ELEMS(q->output_buffer)/2)
|
||||
return -1;
|
||||
|
||||
/* select input buffer */
|
||||
q->compressed_data = in;
|
||||
q->compressed_size = q->checksum_size;
|
||||
@@ -1958,13 +1963,20 @@ static int qdm2_decode_frame(AVCodecContext *avctx,
|
||||
int buf_size = avpkt->size;
|
||||
QDM2Context *s = avctx->priv_data;
|
||||
int16_t *out = data;
|
||||
int i;
|
||||
int i, out_size;
|
||||
|
||||
if(!buf)
|
||||
return 0;
|
||||
if(buf_size < s->checksum_size)
|
||||
return -1;
|
||||
|
||||
out_size = 16 * s->channels * s->frame_size *
|
||||
av_get_bytes_per_sample(avctx->sample_fmt);
|
||||
if (*data_size < out_size) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Output buffer is too small\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
av_log(avctx, AV_LOG_DEBUG, "decode(%d): %p[%d] -> %p[%d]\n",
|
||||
buf_size, buf, s->checksum_size, data, *data_size);
|
||||
|
||||
@@ -1974,7 +1986,7 @@ static int qdm2_decode_frame(AVCodecContext *avctx,
|
||||
out += s->channels * s->frame_size;
|
||||
}
|
||||
|
||||
*data_size = (uint8_t*)out - (uint8_t*)data;
|
||||
*data_size = out_size;
|
||||
|
||||
return s->checksum_size;
|
||||
}
|
||||
|
@@ -127,6 +127,7 @@ static inline void qtrle_decode_2n4bpp(QtrleContext *s, int stream_ptr,
|
||||
while (lines_to_change--) {
|
||||
CHECK_STREAM_PTR(2);
|
||||
pixel_ptr = row_ptr + (num_pixels * (s->buf[stream_ptr++] - 1));
|
||||
CHECK_PIXEL_PTR(0); /* make sure pixel_ptr is positive */
|
||||
|
||||
while ((rle_code = (signed char)s->buf[stream_ptr++]) != -1) {
|
||||
if (rle_code == 0) {
|
||||
@@ -183,6 +184,7 @@ static void qtrle_decode_8bpp(QtrleContext *s, int stream_ptr, int row_ptr, int
|
||||
while (lines_to_change--) {
|
||||
CHECK_STREAM_PTR(2);
|
||||
pixel_ptr = row_ptr + (4 * (s->buf[stream_ptr++] - 1));
|
||||
CHECK_PIXEL_PTR(0); /* make sure pixel_ptr is positive */
|
||||
|
||||
while ((rle_code = (signed char)s->buf[stream_ptr++]) != -1) {
|
||||
if (rle_code == 0) {
|
||||
@@ -236,6 +238,7 @@ static void qtrle_decode_16bpp(QtrleContext *s, int stream_ptr, int row_ptr, int
|
||||
while (lines_to_change--) {
|
||||
CHECK_STREAM_PTR(2);
|
||||
pixel_ptr = row_ptr + (s->buf[stream_ptr++] - 1) * 2;
|
||||
CHECK_PIXEL_PTR(0); /* make sure pixel_ptr is positive */
|
||||
|
||||
while ((rle_code = (signed char)s->buf[stream_ptr++]) != -1) {
|
||||
if (rle_code == 0) {
|
||||
@@ -285,6 +288,7 @@ static void qtrle_decode_24bpp(QtrleContext *s, int stream_ptr, int row_ptr, int
|
||||
while (lines_to_change--) {
|
||||
CHECK_STREAM_PTR(2);
|
||||
pixel_ptr = row_ptr + (s->buf[stream_ptr++] - 1) * 3;
|
||||
CHECK_PIXEL_PTR(0); /* make sure pixel_ptr is positive */
|
||||
|
||||
while ((rle_code = (signed char)s->buf[stream_ptr++]) != -1) {
|
||||
if (rle_code == 0) {
|
||||
@@ -336,6 +340,7 @@ static void qtrle_decode_32bpp(QtrleContext *s, int stream_ptr, int row_ptr, int
|
||||
while (lines_to_change--) {
|
||||
CHECK_STREAM_PTR(2);
|
||||
pixel_ptr = row_ptr + (s->buf[stream_ptr++] - 1) * 4;
|
||||
CHECK_PIXEL_PTR(0); /* make sure pixel_ptr is positive */
|
||||
|
||||
while ((rle_code = (signed char)s->buf[stream_ptr++]) != -1) {
|
||||
if (rle_code == 0) {
|
||||
@@ -464,6 +469,8 @@ static int qtrle_decode_frame(AVCodecContext *avctx,
|
||||
stream_ptr += 4;
|
||||
height = AV_RB16(&s->buf[stream_ptr]);
|
||||
stream_ptr += 4;
|
||||
if (height > s->avctx->height - start_line)
|
||||
goto done;
|
||||
} else {
|
||||
start_line = 0;
|
||||
height = s->avctx->height;
|
||||
|
@@ -326,9 +326,9 @@ int audio_resample(ReSampleContext *s, short *output, short *input, int nb_sampl
|
||||
if (s->sample_fmt[1] != AV_SAMPLE_FMT_S16) {
|
||||
output_bak = output;
|
||||
|
||||
if (!s->buffer_size[1] || s->buffer_size[1] < lenout) {
|
||||
if (!s->buffer_size[1] || s->buffer_size[1] < 2*lenout) {
|
||||
av_free(s->buffer[1]);
|
||||
s->buffer_size[1] = lenout;
|
||||
s->buffer_size[1] = 2*lenout;
|
||||
s->buffer[1] = av_malloc(s->buffer_size[1]);
|
||||
if (!s->buffer[1]) {
|
||||
av_log(s->resample_context, AV_LOG_ERROR, "Could not allocate buffer\n");
|
||||
|
@@ -207,8 +207,10 @@ AVResampleContext *av_resample_init(int out_rate, int in_rate, int filter_size,
|
||||
memcpy(&c->filter_bank[c->filter_length*phase_count+1], c->filter_bank, (c->filter_length-1)*sizeof(FELEM));
|
||||
c->filter_bank[c->filter_length*phase_count]= c->filter_bank[c->filter_length - 1];
|
||||
|
||||
c->src_incr= out_rate;
|
||||
c->ideal_dst_incr= c->dst_incr= in_rate * phase_count;
|
||||
if(!av_reduce(&c->src_incr, &c->dst_incr, out_rate, in_rate * (int64_t)phase_count, INT32_MAX/2))
|
||||
goto error;
|
||||
c->ideal_dst_incr= c->dst_incr;
|
||||
|
||||
c->index= -phase_count*((c->filter_length-1)/2);
|
||||
|
||||
return c;
|
||||
@@ -246,10 +248,9 @@ int av_resample(AVResampleContext *c, short *dst, short *src, int *consumed, int
|
||||
dst[dst_index] = src[index2>>32];
|
||||
index2 += incr;
|
||||
}
|
||||
frac += dst_index * dst_incr_frac;
|
||||
index += dst_index * dst_incr;
|
||||
index += frac / c->src_incr;
|
||||
frac %= c->src_incr;
|
||||
index += (frac + dst_index * (int64_t)dst_incr_frac) / c->src_incr;
|
||||
frac = (frac + dst_index * (int64_t)dst_incr_frac) % c->src_incr;
|
||||
}else{
|
||||
for(dst_index=0; dst_index < dst_size; dst_index++){
|
||||
FELEM *filter= c->filter_bank + c->filter_length*(index & c->phase_mask);
|
||||
|
@@ -113,6 +113,7 @@ static int allocate_buffers(ShortenContext *s)
|
||||
{
|
||||
int i, chan;
|
||||
int *coeffs;
|
||||
void *tmp_ptr;
|
||||
|
||||
for (chan=0; chan<s->channels; chan++) {
|
||||
if(FFMAX(1, s->nmean) >= UINT_MAX/sizeof(int32_t)){
|
||||
@@ -124,9 +125,15 @@ static int allocate_buffers(ShortenContext *s)
|
||||
return -1;
|
||||
}
|
||||
|
||||
s->offset[chan] = av_realloc(s->offset[chan], sizeof(int32_t)*FFMAX(1, s->nmean));
|
||||
tmp_ptr = av_realloc(s->offset[chan], sizeof(int32_t)*FFMAX(1, s->nmean));
|
||||
if (!tmp_ptr)
|
||||
return AVERROR(ENOMEM);
|
||||
s->offset[chan] = tmp_ptr;
|
||||
|
||||
s->decoded[chan] = av_realloc(s->decoded[chan], sizeof(int32_t)*(s->blocksize + s->nwrap));
|
||||
tmp_ptr = av_realloc(s->decoded[chan], sizeof(int32_t)*(s->blocksize + s->nwrap));
|
||||
if (!tmp_ptr)
|
||||
return AVERROR(ENOMEM);
|
||||
s->decoded[chan] = tmp_ptr;
|
||||
for (i=0; i<s->nwrap; i++)
|
||||
s->decoded[chan][i] = 0;
|
||||
s->decoded[chan] += s->nwrap;
|
||||
@@ -284,8 +291,15 @@ static int shorten_decode_frame(AVCodecContext *avctx,
|
||||
int i, input_buf_size = 0;
|
||||
int16_t *samples = data;
|
||||
if(s->max_framesize == 0){
|
||||
void *tmp_ptr;
|
||||
s->max_framesize= 1024; // should hopefully be enough for the first header
|
||||
s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize);
|
||||
tmp_ptr = av_fast_realloc(s->bitstream, &s->allocated_bitstream_size,
|
||||
s->max_framesize);
|
||||
if (!tmp_ptr) {
|
||||
av_log(avctx, AV_LOG_ERROR, "error allocating bitstream buffer\n");
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
s->bitstream = tmp_ptr;
|
||||
}
|
||||
|
||||
if(1 && s->max_framesize){//FIXME truncated
|
||||
@@ -467,6 +481,12 @@ static int shorten_decode_frame(AVCodecContext *avctx,
|
||||
|
||||
s->cur_chan++;
|
||||
if (s->cur_chan == s->channels) {
|
||||
int out_size = s->blocksize * s->channels *
|
||||
av_get_bytes_per_sample(avctx->sample_fmt);
|
||||
if (*data_size < out_size) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Output buffer is too small\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
samples = interleave_buffer(samples, s->channels, s->blocksize, s->decoded);
|
||||
s->cur_chan = 0;
|
||||
goto frame_done;
|
||||
|
@@ -194,14 +194,16 @@ static void decode_parameters(SiprParameters* parms, GetBitContext *pgb,
|
||||
{
|
||||
int i, j;
|
||||
|
||||
parms->ma_pred_switch = get_bits(pgb, p->ma_predictor_bits);
|
||||
if (p->ma_predictor_bits)
|
||||
parms->ma_pred_switch = get_bits(pgb, p->ma_predictor_bits);
|
||||
|
||||
for (i = 0; i < 5; i++)
|
||||
parms->vq_indexes[i] = get_bits(pgb, p->vq_indexes_bits[i]);
|
||||
|
||||
for (i = 0; i < p->subframe_count; i++) {
|
||||
parms->pitch_delay[i] = get_bits(pgb, p->pitch_delay_bits[i]);
|
||||
parms->gp_index[i] = get_bits(pgb, p->gp_index_bits);
|
||||
if (p->gp_index_bits)
|
||||
parms->gp_index[i] = get_bits(pgb, p->gp_index_bits);
|
||||
|
||||
for (j = 0; j < p->number_of_fc_indexes; j++)
|
||||
parms->fc_indexes[i][j] = get_bits(pgb, p->fc_index_bits[j]);
|
||||
@@ -509,7 +511,7 @@ static int sipr_decode_frame(AVCodecContext *avctx, void *datap,
|
||||
GetBitContext gb;
|
||||
float *data = datap;
|
||||
int subframe_size = ctx->mode == MODE_16k ? L_SUBFR_16k : SUBFR_SIZE;
|
||||
int i;
|
||||
int i, out_size;
|
||||
|
||||
ctx->avctx = avctx;
|
||||
if (avpkt->size < (mode_par->bits_per_frame >> 3)) {
|
||||
@@ -520,7 +522,11 @@ static int sipr_decode_frame(AVCodecContext *avctx, void *datap,
|
||||
*data_size = 0;
|
||||
return -1;
|
||||
}
|
||||
if (*data_size < subframe_size * mode_par->subframe_count * sizeof(float)) {
|
||||
|
||||
out_size = mode_par->frames_per_packet * subframe_size *
|
||||
mode_par->subframe_count *
|
||||
av_get_bytes_per_sample(avctx->sample_fmt);
|
||||
if (*data_size < out_size) {
|
||||
av_log(avctx, AV_LOG_ERROR,
|
||||
"Error processing packet: output buffer (%d) too small\n",
|
||||
*data_size);
|
||||
@@ -542,8 +548,7 @@ static int sipr_decode_frame(AVCodecContext *avctx, void *datap,
|
||||
data += subframe_size * mode_par->subframe_count;
|
||||
}
|
||||
|
||||
*data_size = mode_par->frames_per_packet * subframe_size *
|
||||
mode_par->subframe_count * sizeof(float);
|
||||
*data_size = out_size;
|
||||
|
||||
return mode_par->bits_per_frame >> 3;
|
||||
}
|
||||
|
@@ -560,6 +560,10 @@ static av_cold int decode_end(AVCodecContext *avctx)
|
||||
|
||||
static av_cold int smka_decode_init(AVCodecContext *avctx)
|
||||
{
|
||||
if (avctx->channels < 1 || avctx->channels > 2) {
|
||||
av_log(avctx, AV_LOG_ERROR, "invalid number of channels\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
avctx->channel_layout = (avctx->channels==2) ? AV_CH_LAYOUT_STEREO : AV_CH_LAYOUT_MONO;
|
||||
avctx->sample_fmt = avctx->bits_per_coded_sample == 8 ? AV_SAMPLE_FMT_U8 : AV_SAMPLE_FMT_S16;
|
||||
return 0;
|
||||
@@ -583,6 +587,11 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
|
||||
int bits, stereo;
|
||||
int pred[2] = {0, 0};
|
||||
|
||||
if (buf_size <= 4) {
|
||||
av_log(avctx, AV_LOG_ERROR, "packet is too small\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
unp_size = AV_RL32(buf);
|
||||
|
||||
init_get_bits(&gb, buf + 4, (buf_size - 4) * 8);
|
||||
@@ -598,6 +607,14 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
|
||||
av_log(avctx, AV_LOG_ERROR, "Frame is too large to fit in buffer\n");
|
||||
return -1;
|
||||
}
|
||||
if (stereo ^ (avctx->channels != 1)) {
|
||||
av_log(avctx, AV_LOG_ERROR, "channels mismatch\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
if (bits && avctx->sample_fmt == AV_SAMPLE_FMT_U8) {
|
||||
av_log(avctx, AV_LOG_ERROR, "sample format mismatch\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
memset(vlc, 0, sizeof(VLC) * 4);
|
||||
memset(h, 0, sizeof(HuffContext) * 4);
|
||||
|
@@ -1917,8 +1917,6 @@ static void dwt_quantize(SnowContext *s, Plane *p, DWTELEM *buffer, int width, i
|
||||
static void halfpel_interpol(SnowContext *s, uint8_t *halfpel[4][4], AVFrame *frame){
|
||||
int p,x,y;
|
||||
|
||||
assert(!(s->avctx->flags & CODEC_FLAG_EMU_EDGE));
|
||||
|
||||
for(p=0; p<3; p++){
|
||||
int is_chroma= !!p;
|
||||
int w= s->avctx->width >>is_chroma;
|
||||
@@ -1975,7 +1973,7 @@ static int frame_start(SnowContext *s){
|
||||
int w= s->avctx->width; //FIXME round up to x16 ?
|
||||
int h= s->avctx->height;
|
||||
|
||||
if(s->current_picture.data[0]){
|
||||
if(s->current_picture.data[0] && !(s->avctx->flags&CODEC_FLAG_EMU_EDGE)){
|
||||
s->dsp.draw_edges(s->current_picture.data[0],
|
||||
s->current_picture.linesize[0], w , h ,
|
||||
EDGE_WIDTH , EDGE_WIDTH , EDGE_TOP | EDGE_BOTTOM);
|
||||
|
@@ -658,6 +658,7 @@ static int svq1_decode_frame(AVCodecContext *avctx,
|
||||
av_dlog(s->avctx, "Error in svq1_decode_frame_header %i\n",result);
|
||||
return result;
|
||||
}
|
||||
avcodec_set_dimensions(avctx, s->width, s->height);
|
||||
|
||||
//FIXME this avoids some confusion for "B frames" without 2 references
|
||||
//this should be removed after libavcodec can handle more flexible picture types & ordering
|
||||
|
@@ -56,6 +56,11 @@ static av_cold int truespeech_decode_init(AVCodecContext * avctx)
|
||||
{
|
||||
// TSContext *c = avctx->priv_data;
|
||||
|
||||
if (avctx->channels != 1) {
|
||||
av_log_ask_for_sample(avctx, "Unsupported channel count: %d\n", avctx->channels);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
avctx->sample_fmt = AV_SAMPLE_FMT_S16;
|
||||
return 0;
|
||||
}
|
||||
|
@@ -822,7 +822,7 @@ static int twin_decode_frame(AVCodecContext * avctx, void *data,
|
||||
const ModeTab *mtab = tctx->mtab;
|
||||
float *out = data;
|
||||
enum FrameType ftype;
|
||||
int window_type;
|
||||
int window_type, out_size;
|
||||
static const enum FrameType wtype_to_ftype_table[] = {
|
||||
FT_LONG, FT_LONG, FT_SHORT, FT_LONG,
|
||||
FT_MEDIUM, FT_LONG, FT_LONG, FT_MEDIUM, FT_MEDIUM
|
||||
@@ -835,6 +835,13 @@ static int twin_decode_frame(AVCodecContext * avctx, void *data,
|
||||
return buf_size;
|
||||
}
|
||||
|
||||
out_size = mtab->size * avctx->channels *
|
||||
av_get_bytes_per_sample(avctx->sample_fmt);
|
||||
if (*data_size < out_size) {
|
||||
av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
init_get_bits(&gb, buf, buf_size * 8);
|
||||
skip_bits(&gb, get_bits(&gb, 8));
|
||||
window_type = get_bits(&gb, WINDOW_TYPE_BITS);
|
||||
@@ -857,7 +864,7 @@ static int twin_decode_frame(AVCodecContext * avctx, void *data,
|
||||
return buf_size;
|
||||
}
|
||||
|
||||
*data_size = mtab->size*avctx->channels*4;
|
||||
*data_size = out_size;
|
||||
|
||||
return buf_size;
|
||||
}
|
||||
|
@@ -23,6 +23,7 @@
|
||||
|
||||
#include "libavutil/intreadwrite.h"
|
||||
#include "libavutil/imgutils.h"
|
||||
#include "bytestream.h"
|
||||
#include "avcodec.h"
|
||||
#include "s3tc.h"
|
||||
|
||||
@@ -42,6 +43,7 @@ static av_cold int txd_init(AVCodecContext *avctx) {
|
||||
static int txd_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
|
||||
AVPacket *avpkt) {
|
||||
const uint8_t *buf = avpkt->data;
|
||||
const uint8_t *buf_end = avpkt->data + avpkt->size;
|
||||
TXDContext * const s = avctx->priv_data;
|
||||
AVFrame *picture = data;
|
||||
AVFrame * const p = &s->picture;
|
||||
@@ -52,6 +54,8 @@ static int txd_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
|
||||
const uint32_t *palette = (const uint32_t *)(cur + 88);
|
||||
uint32_t *pal;
|
||||
|
||||
if (buf_end - cur < 92)
|
||||
return AVERROR_INVALIDDATA;
|
||||
version = AV_RL32(cur);
|
||||
d3d_format = AV_RL32(cur+76);
|
||||
w = AV_RL16(cur+80);
|
||||
@@ -69,6 +73,8 @@ static int txd_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
|
||||
|
||||
if (depth == 8) {
|
||||
avctx->pix_fmt = PIX_FMT_PAL8;
|
||||
if (buf_end - cur < 1024)
|
||||
return AVERROR_INVALIDDATA;
|
||||
cur += 1024;
|
||||
} else if (depth == 16 || depth == 32)
|
||||
avctx->pix_fmt = PIX_FMT_RGB32;
|
||||
@@ -100,6 +106,8 @@ static int txd_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
|
||||
v = AV_RB32(palette+y);
|
||||
pal[y] = (v>>8) + (v<<24);
|
||||
}
|
||||
if (buf_end - cur < w * h)
|
||||
return AVERROR_INVALIDDATA;
|
||||
for (y=0; y<h; y++) {
|
||||
memcpy(ptr, cur, w);
|
||||
ptr += stride;
|
||||
@@ -110,9 +118,13 @@ static int txd_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
|
||||
case 0:
|
||||
if (!flags&1) goto unsupported;
|
||||
case FF_S3TC_DXT1:
|
||||
if (buf_end - cur < (w/4) * (h/4) * 8)
|
||||
return AVERROR_INVALIDDATA;
|
||||
ff_decode_dxt1(cur, ptr, w, h, stride);
|
||||
break;
|
||||
case FF_S3TC_DXT3:
|
||||
if (buf_end - cur < (w/4) * (h/4) * 16)
|
||||
return AVERROR_INVALIDDATA;
|
||||
ff_decode_dxt3(cur, ptr, w, h, stride);
|
||||
break;
|
||||
default:
|
||||
@@ -122,6 +134,8 @@ static int txd_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
|
||||
switch (d3d_format) {
|
||||
case 0x15:
|
||||
case 0x16:
|
||||
if (buf_end - cur < h * w * 4)
|
||||
return AVERROR_INVALIDDATA;
|
||||
for (y=0; y<h; y++) {
|
||||
memcpy(ptr, cur, w*4);
|
||||
ptr += stride;
|
||||
@@ -133,8 +147,12 @@ static int txd_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
|
||||
}
|
||||
}
|
||||
|
||||
for (; mipmap_count > 1; mipmap_count--)
|
||||
cur += AV_RL32(cur) + 4;
|
||||
for (; mipmap_count > 1 && buf_end - cur >= 4; mipmap_count--) {
|
||||
uint32_t length = bytestream_get_le32(&cur);
|
||||
if (buf_end - cur < length)
|
||||
break;
|
||||
cur += length;
|
||||
}
|
||||
|
||||
*picture = s->picture;
|
||||
*data_size = sizeof(AVPicture);
|
||||
|
@@ -32,6 +32,7 @@
|
||||
#include "libavutil/audioconvert.h"
|
||||
#include "libavutil/imgutils.h"
|
||||
#include "libavutil/samplefmt.h"
|
||||
#include "libavutil/dict.h"
|
||||
#include "avcodec.h"
|
||||
#include "dsputil.h"
|
||||
#include "libavutil/opt.h"
|
||||
@@ -485,9 +486,20 @@ static void avcodec_get_subtitle_defaults(AVSubtitle *sub)
|
||||
sub->pts = AV_NOPTS_VALUE;
|
||||
}
|
||||
|
||||
#if FF_API_AVCODEC_OPEN
|
||||
int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec)
|
||||
{
|
||||
return avcodec_open2(avctx, codec, NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
int attribute_align_arg avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options)
|
||||
{
|
||||
int ret = 0;
|
||||
AVDictionary *tmp = NULL;
|
||||
|
||||
if (options)
|
||||
av_dict_copy(&tmp, *options, 0);
|
||||
|
||||
/* If there is a user-supplied mutex locking routine, call it. */
|
||||
if (ff_lockmgr_cb) {
|
||||
@@ -514,14 +526,18 @@ int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec)
|
||||
ret = AVERROR(ENOMEM);
|
||||
goto end;
|
||||
}
|
||||
if(codec->priv_class){ //this can be droped once all user apps use avcodec_get_context_defaults3()
|
||||
if (codec->priv_class) {
|
||||
*(AVClass**)avctx->priv_data= codec->priv_class;
|
||||
av_opt_set_defaults(avctx->priv_data);
|
||||
}
|
||||
}
|
||||
if (codec->priv_class && (ret = av_opt_set_dict(avctx->priv_data, &tmp)) < 0)
|
||||
goto free_and_end;
|
||||
} else {
|
||||
avctx->priv_data = NULL;
|
||||
}
|
||||
if ((ret = av_opt_set_dict(avctx, &tmp)) < 0)
|
||||
goto free_and_end;
|
||||
|
||||
if(avctx->coded_width && avctx->coded_height)
|
||||
avcodec_set_dimensions(avctx, avctx->coded_width, avctx->coded_height);
|
||||
@@ -640,8 +656,14 @@ end:
|
||||
if (ff_lockmgr_cb) {
|
||||
(*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE);
|
||||
}
|
||||
if (options) {
|
||||
av_dict_free(options);
|
||||
*options = tmp;
|
||||
}
|
||||
|
||||
return ret;
|
||||
free_and_end:
|
||||
av_dict_free(&tmp);
|
||||
av_freep(&avctx->priv_data);
|
||||
avctx->codec= NULL;
|
||||
goto end;
|
||||
|
@@ -116,6 +116,18 @@ static inline VAMvModeVC1 vc1_get_MVMODE2(VC1Context *v)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** Reconstruct bitstream TTFRM (7.1.1.41, Table-53) */
|
||||
static inline int vc1_get_TTFRM(VC1Context *v)
|
||||
{
|
||||
switch (v->ttfrm) {
|
||||
case TT_8X8: return 0;
|
||||
case TT_8X4: return 1;
|
||||
case TT_4X8: return 2;
|
||||
case TT_4X4: return 3;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** Pack FFmpeg bitplanes into a VABitPlaneBuffer element */
|
||||
static inline void vc1_pack_bitplanes(uint8_t *bitplane, int n, const uint8_t *ff_bp[3], int x, int y, int stride)
|
||||
{
|
||||
@@ -239,7 +251,7 @@ static int vaapi_vc1_start_frame(AVCodecContext *avctx, av_unused const uint8_t
|
||||
pic_param->transform_fields.value = 0; /* reset all bits */
|
||||
pic_param->transform_fields.bits.variable_sized_transform_flag = v->vstransform;
|
||||
pic_param->transform_fields.bits.mb_level_transform_type_flag = v->ttmbf;
|
||||
pic_param->transform_fields.bits.frame_level_transform_type = v->ttfrm;
|
||||
pic_param->transform_fields.bits.frame_level_transform_type = vc1_get_TTFRM(v);
|
||||
pic_param->transform_fields.bits.transform_ac_codingset_idx1 = v->c_ac_table_index;
|
||||
pic_param->transform_fields.bits.transform_ac_codingset_idx2 = v->y_ac_table_index;
|
||||
pic_param->transform_fields.bits.intra_transform_dc_table = v->s.dc_table_index;
|
||||
|
@@ -21,7 +21,7 @@
|
||||
#define AVCODEC_VERSION_H
|
||||
|
||||
#define LIBAVCODEC_VERSION_MAJOR 53
|
||||
#define LIBAVCODEC_VERSION_MINOR 7
|
||||
#define LIBAVCODEC_VERSION_MINOR 8
|
||||
#define LIBAVCODEC_VERSION_MICRO 0
|
||||
|
||||
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
|
||||
@@ -68,5 +68,8 @@
|
||||
#ifndef FF_API_GET_PIX_FMT_NAME
|
||||
#define FF_API_GET_PIX_FMT_NAME (LIBAVCODEC_VERSION_MAJOR < 54)
|
||||
#endif
|
||||
#ifndef FF_API_AVCODEC_OPEN
|
||||
#define FF_API_AVCODEC_OPEN (LIBAVCODEC_VERSION_MAJOR < 54)
|
||||
#endif
|
||||
|
||||
#endif /* AVCODEC_VERSION_H */
|
||||
|
@@ -1605,7 +1605,7 @@ static int vorbis_decode_frame(AVCodecContext *avccontext,
|
||||
vorbis_context *vc = avccontext->priv_data ;
|
||||
GetBitContext *gb = &(vc->gb);
|
||||
const float *channel_ptrs[255];
|
||||
int i, len;
|
||||
int i, len, out_size;
|
||||
|
||||
if (!buf_size)
|
||||
return 0;
|
||||
@@ -1630,6 +1630,13 @@ static int vorbis_decode_frame(AVCodecContext *avccontext,
|
||||
av_dlog(NULL, "parsed %d bytes %d bits, returned %d samples (*ch*bits) \n",
|
||||
get_bits_count(gb) / 8, get_bits_count(gb) % 8, len);
|
||||
|
||||
out_size = len * vc->audio_channels *
|
||||
av_get_bytes_per_sample(avccontext->sample_fmt);
|
||||
if (*data_size < out_size) {
|
||||
av_log(avccontext, AV_LOG_ERROR, "output buffer is too small\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
if (vc->audio_channels > 8) {
|
||||
for (i = 0; i < vc->audio_channels; i++)
|
||||
channel_ptrs[i] = vc->channel_floors + i * len;
|
||||
@@ -1645,8 +1652,7 @@ static int vorbis_decode_frame(AVCodecContext *avccontext,
|
||||
vc->fmt_conv.float_to_int16_interleave(data, channel_ptrs, len,
|
||||
vc->audio_channels);
|
||||
|
||||
*data_size = len * vc->audio_channels *
|
||||
av_get_bytes_per_sample(avccontext->sample_fmt);
|
||||
*data_size = out_size;
|
||||
|
||||
return buf_size ;
|
||||
}
|
||||
|
@@ -45,6 +45,7 @@
|
||||
#define FRAGMENT_PIXELS 8
|
||||
|
||||
static av_cold int vp3_decode_end(AVCodecContext *avctx);
|
||||
static void vp3_decode_flush(AVCodecContext *avctx);
|
||||
|
||||
//FIXME split things out into their own arrays
|
||||
typedef struct Vp3Fragment {
|
||||
@@ -890,7 +891,7 @@ static int unpack_vlcs(Vp3DecodeContext *s, GetBitContext *gb,
|
||||
/* decode a VLC into a token */
|
||||
token = get_vlc2(gb, vlc_table, 11, 3);
|
||||
/* use the token to get a zero run, a coefficient, and an eob run */
|
||||
if (token <= 6) {
|
||||
if ((unsigned) token <= 6U) {
|
||||
eob_run = eob_run_base[token];
|
||||
if (eob_run_get_bits[token])
|
||||
eob_run += get_bits(gb, eob_run_get_bits[token]);
|
||||
@@ -908,7 +909,7 @@ static int unpack_vlcs(Vp3DecodeContext *s, GetBitContext *gb,
|
||||
coeff_i += eob_run;
|
||||
eob_run = 0;
|
||||
}
|
||||
} else {
|
||||
} else if (token >= 0) {
|
||||
bits_to_get = coeff_get_bits[token];
|
||||
if (bits_to_get)
|
||||
bits_to_get = get_bits(gb, bits_to_get);
|
||||
@@ -942,6 +943,10 @@ static int unpack_vlcs(Vp3DecodeContext *s, GetBitContext *gb,
|
||||
for (i = coeff_index+1; i <= coeff_index+zero_run; i++)
|
||||
s->num_coded_frags[plane][i]--;
|
||||
coeff_i++;
|
||||
} else {
|
||||
av_log(s->avctx, AV_LOG_ERROR,
|
||||
"Invalid token %d\n", token);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -991,6 +996,8 @@ static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
|
||||
/* unpack the Y plane DC coefficients */
|
||||
residual_eob_run = unpack_vlcs(s, gb, &s->dc_vlc[dc_y_table], 0,
|
||||
0, residual_eob_run);
|
||||
if (residual_eob_run < 0)
|
||||
return residual_eob_run;
|
||||
|
||||
/* reverse prediction of the Y-plane DC coefficients */
|
||||
reverse_dc_prediction(s, 0, s->fragment_width[0], s->fragment_height[0]);
|
||||
@@ -998,8 +1005,12 @@ static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
|
||||
/* unpack the C plane DC coefficients */
|
||||
residual_eob_run = unpack_vlcs(s, gb, &s->dc_vlc[dc_c_table], 0,
|
||||
1, residual_eob_run);
|
||||
if (residual_eob_run < 0)
|
||||
return residual_eob_run;
|
||||
residual_eob_run = unpack_vlcs(s, gb, &s->dc_vlc[dc_c_table], 0,
|
||||
2, residual_eob_run);
|
||||
if (residual_eob_run < 0)
|
||||
return residual_eob_run;
|
||||
|
||||
/* reverse prediction of the C-plane DC coefficients */
|
||||
if (!(s->avctx->flags & CODEC_FLAG_GRAY))
|
||||
@@ -1036,11 +1047,17 @@ static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
|
||||
for (i = 1; i <= 63; i++) {
|
||||
residual_eob_run = unpack_vlcs(s, gb, y_tables[i], i,
|
||||
0, residual_eob_run);
|
||||
if (residual_eob_run < 0)
|
||||
return residual_eob_run;
|
||||
|
||||
residual_eob_run = unpack_vlcs(s, gb, c_tables[i], i,
|
||||
1, residual_eob_run);
|
||||
if (residual_eob_run < 0)
|
||||
return residual_eob_run;
|
||||
residual_eob_run = unpack_vlcs(s, gb, c_tables[i], i,
|
||||
2, residual_eob_run);
|
||||
if (residual_eob_run < 0)
|
||||
return residual_eob_run;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -1291,6 +1308,10 @@ static inline int vp3_dequant(Vp3DecodeContext *s, Vp3Fragment *frag,
|
||||
case 1: // zero run
|
||||
s->dct_tokens[plane][i]++;
|
||||
i += (token >> 2) & 0x7f;
|
||||
if(i>63){
|
||||
av_log(s->avctx, AV_LOG_ERROR, "Coefficient index overflow\n");
|
||||
return -1;
|
||||
}
|
||||
block[perm[i]] = (token >> 9) * dequantizer[perm[i]];
|
||||
i++;
|
||||
break;
|
||||
@@ -1777,10 +1798,15 @@ static int vp3_update_thread_context(AVCodecContext *dst, const AVCodecContext *
|
||||
Vp3DecodeContext *s = dst->priv_data, *s1 = src->priv_data;
|
||||
int qps_changed = 0, i, err;
|
||||
|
||||
#define copy_fields(to, from, start_field, end_field) memcpy(&to->start_field, &from->start_field, (char*)&to->end_field - (char*)&to->start_field)
|
||||
|
||||
if (!s1->current_frame.data[0]
|
||||
||s->width != s1->width
|
||||
||s->height!= s1->height)
|
||||
||s->height!= s1->height) {
|
||||
if (s != s1)
|
||||
copy_fields(s, s1, golden_frame, current_frame);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (s != s1) {
|
||||
// init tables if the first frame hasn't been decoded
|
||||
@@ -1796,8 +1822,6 @@ static int vp3_update_thread_context(AVCodecContext *dst, const AVCodecContext *
|
||||
memcpy(s->motion_val[1], s1->motion_val[1], c_fragment_count * sizeof(*s->motion_val[1]));
|
||||
}
|
||||
|
||||
#define copy_fields(to, from, start_field, end_field) memcpy(&to->start_field, &from->start_field, (char*)&to->end_field - (char*)&to->start_field)
|
||||
|
||||
// copy previous frame data
|
||||
copy_fields(s, s1, golden_frame, dsp);
|
||||
|
||||
@@ -1987,9 +2011,6 @@ static av_cold int vp3_decode_end(AVCodecContext *avctx)
|
||||
Vp3DecodeContext *s = avctx->priv_data;
|
||||
int i;
|
||||
|
||||
if (avctx->is_copy && !s->current_frame.data[0])
|
||||
return 0;
|
||||
|
||||
av_free(s->superblock_coding);
|
||||
av_free(s->all_fragments);
|
||||
av_free(s->coded_fragment_list[0]);
|
||||
@@ -2016,12 +2037,7 @@ static av_cold int vp3_decode_end(AVCodecContext *avctx)
|
||||
free_vlc(&s->motion_vector_vlc);
|
||||
|
||||
/* release all frames */
|
||||
if (s->golden_frame.data[0])
|
||||
ff_thread_release_buffer(avctx, &s->golden_frame);
|
||||
if (s->last_frame.data[0] && s->last_frame.type != FF_BUFFER_TYPE_COPY)
|
||||
ff_thread_release_buffer(avctx, &s->last_frame);
|
||||
/* no need to release the current_frame since it will always be pointing
|
||||
* to the same frame as either the golden or last frame */
|
||||
vp3_decode_flush(avctx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -2341,6 +2357,23 @@ static void vp3_decode_flush(AVCodecContext *avctx)
|
||||
ff_thread_release_buffer(avctx, &s->current_frame);
|
||||
}
|
||||
|
||||
static int vp3_init_thread_copy(AVCodecContext *avctx)
|
||||
{
|
||||
Vp3DecodeContext *s = avctx->priv_data;
|
||||
|
||||
s->superblock_coding = NULL;
|
||||
s->all_fragments = NULL;
|
||||
s->coded_fragment_list[0] = NULL;
|
||||
s->dct_tokens_base = NULL;
|
||||
s->superblock_fragments = NULL;
|
||||
s->macroblock_coding = NULL;
|
||||
s->motion_val[0] = NULL;
|
||||
s->motion_val[1] = NULL;
|
||||
s->edge_emu_buffer = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
AVCodec ff_theora_decoder = {
|
||||
"theora",
|
||||
AVMEDIA_TYPE_VIDEO,
|
||||
@@ -2354,6 +2387,7 @@ AVCodec ff_theora_decoder = {
|
||||
NULL,
|
||||
.flush = vp3_decode_flush,
|
||||
.long_name = NULL_IF_CONFIG_SMALL("Theora"),
|
||||
.init_thread_copy = ONLY_IF_THREADS_ENABLED(vp3_init_thread_copy),
|
||||
.update_thread_context = ONLY_IF_THREADS_ENABLED(vp3_update_thread_context)
|
||||
};
|
||||
#endif
|
||||
@@ -2371,5 +2405,6 @@ AVCodec ff_vp3_decoder = {
|
||||
NULL,
|
||||
.flush = vp3_decode_flush,
|
||||
.long_name = NULL_IF_CONFIG_SMALL("On2 VP3"),
|
||||
.init_thread_copy = ONLY_IF_THREADS_ENABLED(vp3_init_thread_copy),
|
||||
.update_thread_context = ONLY_IF_THREADS_ENABLED(vp3_update_thread_context)
|
||||
};
|
||||
|
@@ -183,7 +183,8 @@ static void vp5_parse_coeff(VP56Context *s)
|
||||
model1 = model->coeff_dccv[pt];
|
||||
model2 = model->coeff_dcct[pt][ctx];
|
||||
|
||||
for (coeff_idx=0; coeff_idx<64; ) {
|
||||
coeff_idx = 0;
|
||||
for (;;) {
|
||||
if (vp56_rac_get_prob(c, model2[0])) {
|
||||
if (vp56_rac_get_prob(c, model2[2])) {
|
||||
if (vp56_rac_get_prob(c, model2[3])) {
|
||||
@@ -220,8 +221,11 @@ static void vp5_parse_coeff(VP56Context *s)
|
||||
ct = 0;
|
||||
s->coeff_ctx[vp56_b6to4[b]][coeff_idx] = 0;
|
||||
}
|
||||
coeff_idx++;
|
||||
if (coeff_idx >= 64)
|
||||
break;
|
||||
|
||||
cg = vp5_coeff_groups[++coeff_idx];
|
||||
cg = vp5_coeff_groups[coeff_idx];
|
||||
ctx = s->coeff_ctx[vp56_b6to4[b]][coeff_idx];
|
||||
model1 = model->coeff_ract[pt][ct][cg];
|
||||
model2 = cg > 2 ? model1 : model->coeff_acct[pt][ct][cg][ctx];
|
||||
|
@@ -374,7 +374,7 @@ static void vp6_parse_coeff_huffman(VP56Context *s)
|
||||
if (b > 3) pt = 1;
|
||||
vlc_coeff = &s->dccv_vlc[pt];
|
||||
|
||||
for (coeff_idx=0; coeff_idx<64; ) {
|
||||
for (coeff_idx = 0;;) {
|
||||
int run = 1;
|
||||
if (coeff_idx<2 && s->nb_null[coeff_idx][pt]) {
|
||||
s->nb_null[coeff_idx][pt]--;
|
||||
@@ -411,6 +411,8 @@ static void vp6_parse_coeff_huffman(VP56Context *s)
|
||||
}
|
||||
}
|
||||
coeff_idx+=run;
|
||||
if (coeff_idx >= 64)
|
||||
break;
|
||||
cg = FFMIN(vp6_coeff_groups[coeff_idx], 3);
|
||||
vlc_coeff = &s->ract_vlc[pt][ct][cg];
|
||||
}
|
||||
@@ -438,7 +440,8 @@ static void vp6_parse_coeff(VP56Context *s)
|
||||
model1 = model->coeff_dccv[pt];
|
||||
model2 = model->coeff_dcct[pt][ctx];
|
||||
|
||||
for (coeff_idx=0; coeff_idx<64; ) {
|
||||
coeff_idx = 0;
|
||||
for (;;) {
|
||||
if ((coeff_idx>1 && ct==0) || vp56_rac_get_prob(c, model2[0])) {
|
||||
/* parse a coeff */
|
||||
if (vp56_rac_get_prob(c, model2[2])) {
|
||||
@@ -479,8 +482,10 @@ static void vp6_parse_coeff(VP56Context *s)
|
||||
run += vp56_rac_get_prob(c, model3[i+8]) << i;
|
||||
}
|
||||
}
|
||||
|
||||
cg = vp6_coeff_groups[coeff_idx+=run];
|
||||
coeff_idx += run;
|
||||
if (coeff_idx >= 64)
|
||||
break;
|
||||
cg = vp6_coeff_groups[coeff_idx];
|
||||
model1 = model2 = model->coeff_ract[pt][ct][cg];
|
||||
}
|
||||
|
||||
|
@@ -33,6 +33,19 @@
|
||||
# include "arm/vp8.h"
|
||||
#endif
|
||||
|
||||
static void free_buffers(VP8Context *s)
|
||||
{
|
||||
av_freep(&s->macroblocks_base);
|
||||
av_freep(&s->filter_strength);
|
||||
av_freep(&s->intra4x4_pred_mode_top);
|
||||
av_freep(&s->top_nnz);
|
||||
av_freep(&s->edge_emu_buffer);
|
||||
av_freep(&s->top_border);
|
||||
av_freep(&s->segmentation_map);
|
||||
|
||||
s->macroblocks = NULL;
|
||||
}
|
||||
|
||||
static void vp8_decode_flush(AVCodecContext *avctx)
|
||||
{
|
||||
VP8Context *s = avctx->priv_data;
|
||||
@@ -45,15 +58,7 @@ static void vp8_decode_flush(AVCodecContext *avctx)
|
||||
}
|
||||
memset(s->framep, 0, sizeof(s->framep));
|
||||
|
||||
av_freep(&s->macroblocks_base);
|
||||
av_freep(&s->filter_strength);
|
||||
av_freep(&s->intra4x4_pred_mode_top);
|
||||
av_freep(&s->top_nnz);
|
||||
av_freep(&s->edge_emu_buffer);
|
||||
av_freep(&s->top_border);
|
||||
av_freep(&s->segmentation_map);
|
||||
|
||||
s->macroblocks = NULL;
|
||||
free_buffers(s);
|
||||
}
|
||||
|
||||
static int update_dimensions(VP8Context *s, int width, int height)
|
||||
@@ -273,7 +278,7 @@ static int decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_size)
|
||||
|
||||
if (!s->macroblocks_base || /* first frame */
|
||||
width != s->avctx->width || height != s->avctx->height) {
|
||||
if ((ret = update_dimensions(s, width, height) < 0))
|
||||
if ((ret = update_dimensions(s, width, height)) < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -487,6 +492,7 @@ void decode_mvs(VP8Context *s, VP8Macroblock *mb, int mb_x, int mb_y)
|
||||
|
||||
AV_ZERO32(&near_mv[0]);
|
||||
AV_ZERO32(&near_mv[1]);
|
||||
AV_ZERO32(&near_mv[2]);
|
||||
|
||||
/* Process MB on top, left and top-left */
|
||||
#define MV_EDGE_CHECK(n)\
|
||||
@@ -919,7 +925,8 @@ void intra_predict(VP8Context *s, uint8_t *dst[3], VP8Macroblock *mb,
|
||||
int mb_x, int mb_y)
|
||||
{
|
||||
AVCodecContext *avctx = s->avctx;
|
||||
int x, y, mode, nnz, tr;
|
||||
int x, y, mode, nnz;
|
||||
uint32_t tr;
|
||||
|
||||
// for the first row, we need to run xchg_mb_border to init the top edge to 127
|
||||
// otherwise, skip it if we aren't going to deblock
|
||||
@@ -948,7 +955,7 @@ void intra_predict(VP8Context *s, uint8_t *dst[3], VP8Macroblock *mb,
|
||||
// from the top macroblock
|
||||
if (!(!mb_y && avctx->flags & CODEC_FLAG_EMU_EDGE) &&
|
||||
mb_x == s->mb_width-1) {
|
||||
tr = tr_right[-1]*0x01010101;
|
||||
tr = tr_right[-1]*0x01010101u;
|
||||
tr_right = (uint8_t *)&tr;
|
||||
}
|
||||
|
||||
@@ -1749,6 +1756,11 @@ static int vp8_decode_update_thread_context(AVCodecContext *dst, const AVCodecCo
|
||||
{
|
||||
VP8Context *s = dst->priv_data, *s_src = src->priv_data;
|
||||
|
||||
if (s->macroblocks_base &&
|
||||
(s_src->mb_width != s->mb_width || s_src->mb_height != s->mb_height)) {
|
||||
free_buffers(s);
|
||||
}
|
||||
|
||||
s->prob[0] = s_src->prob[!s_src->update_probabilities];
|
||||
s->segmentation = s_src->segmentation;
|
||||
s->lf_delta = s_src->lf_delta;
|
||||
|
@@ -138,6 +138,10 @@ static av_cold int vqa_decode_init(AVCodecContext *avctx)
|
||||
/* load up the VQA parameters from the header */
|
||||
vqa_header = (unsigned char *)s->avctx->extradata;
|
||||
s->vqa_version = vqa_header[0];
|
||||
if (s->vqa_version < 1 || s->vqa_version > 3) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, " VQA video: unsupported version %d\n", s->vqa_version);
|
||||
return -1;
|
||||
}
|
||||
s->width = AV_RL16(&vqa_header[6]);
|
||||
s->height = AV_RL16(&vqa_header[8]);
|
||||
if(av_image_check_size(s->width, s->height, 0, avctx)){
|
||||
@@ -226,6 +230,8 @@ static void decode_format80(const unsigned char *src, int src_size,
|
||||
src_index += 2;
|
||||
av_dlog(NULL, "(1) copy %X bytes from absolute pos %X\n", count, src_pos);
|
||||
CHECK_COUNT();
|
||||
if (src_pos + count > dest_size)
|
||||
return;
|
||||
for (i = 0; i < count; i++)
|
||||
dest[dest_index + i] = dest[src_pos + i];
|
||||
dest_index += count;
|
||||
@@ -248,6 +254,8 @@ static void decode_format80(const unsigned char *src, int src_size,
|
||||
src_index += 2;
|
||||
av_dlog(NULL, "(3) copy %X bytes from absolute pos %X\n", count, src_pos);
|
||||
CHECK_COUNT();
|
||||
if (src_pos + count > dest_size)
|
||||
return;
|
||||
for (i = 0; i < count; i++)
|
||||
dest[dest_index + i] = dest[src_pos + i];
|
||||
dest_index += count;
|
||||
@@ -268,6 +276,8 @@ static void decode_format80(const unsigned char *src, int src_size,
|
||||
src_index += 2;
|
||||
av_dlog(NULL, "(5) copy %X bytes from relpos %X\n", count, src_pos);
|
||||
CHECK_COUNT();
|
||||
if (dest_index < src_pos)
|
||||
return;
|
||||
for (i = 0; i < count; i++)
|
||||
dest[dest_index + i] = dest[dest_index - src_pos + i];
|
||||
dest_index += count;
|
||||
|
@@ -109,6 +109,11 @@ static int wma_decode_init(AVCodecContext * avctx)
|
||||
}
|
||||
}
|
||||
|
||||
if(avctx->channels > MAX_CHANNELS){
|
||||
av_log(avctx, AV_LOG_ERROR, "Invalid number of channels (%d)\n", avctx->channels);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(ff_wma_init(avctx, flags2)<0)
|
||||
return -1;
|
||||
|
||||
|
@@ -1085,7 +1085,7 @@ static void aw_pulse_set2(WMAVoiceContext *s, GetBitContext *gb,
|
||||
int excl_range = s->aw_pulse_range; // always 16 or 24
|
||||
uint16_t *use_mask_ptr = &use_mask[idx >> 4];
|
||||
int first_sh = 16 - (idx & 15);
|
||||
*use_mask_ptr++ &= 0xFFFF << first_sh;
|
||||
*use_mask_ptr++ &= 0xFFFFu << first_sh;
|
||||
excl_range -= first_sh;
|
||||
if (excl_range >= 16) {
|
||||
*use_mask_ptr++ = 0;
|
||||
|
@@ -129,7 +129,9 @@ static int xan_unpack(uint8_t *dest, const int dest_len,
|
||||
if (size + size2 > dest_end - dest)
|
||||
break;
|
||||
}
|
||||
if (src + size > src_end || dest + size + size2 > dest_end)
|
||||
if (src + size > src_end ||
|
||||
dest + size + size2 > dest_end ||
|
||||
dest + size - orig_dest < back )
|
||||
return -1;
|
||||
bytestream_get_buffer(&src, dest, size);
|
||||
dest += size;
|
||||
@@ -194,6 +196,8 @@ static int xan_decode_chroma(AVCodecContext *avctx, AVPacket *avpkt)
|
||||
if (mode) {
|
||||
for (j = 0; j < avctx->height >> 1; j++) {
|
||||
for (i = 0; i < avctx->width >> 1; i++) {
|
||||
if (src_end - src < 1)
|
||||
return 0;
|
||||
val = *src++;
|
||||
if (val) {
|
||||
val = AV_RL16(table + (val << 1));
|
||||
@@ -202,8 +206,6 @@ static int xan_decode_chroma(AVCodecContext *avctx, AVPacket *avpkt)
|
||||
U[i] = uval | (uval >> 5);
|
||||
V[i] = vval | (vval >> 5);
|
||||
}
|
||||
if (src == src_end)
|
||||
return 0;
|
||||
}
|
||||
U += s->pic.linesize[1];
|
||||
V += s->pic.linesize[2];
|
||||
@@ -214,6 +216,8 @@ static int xan_decode_chroma(AVCodecContext *avctx, AVPacket *avpkt)
|
||||
|
||||
for (j = 0; j < avctx->height >> 2; j++) {
|
||||
for (i = 0; i < avctx->width >> 1; i += 2) {
|
||||
if (src_end - src < 1)
|
||||
return 0;
|
||||
val = *src++;
|
||||
if (val) {
|
||||
val = AV_RL16(table + (val << 1));
|
||||
@@ -302,6 +306,9 @@ static int xan_decode_frame_type0(AVCodecContext *avctx, AVPacket *avpkt)
|
||||
corr_end - corr_off);
|
||||
if (dec_size < 0)
|
||||
dec_size = 0;
|
||||
else
|
||||
dec_size = FFMIN(dec_size, s->buffer_size/2 - 1);
|
||||
|
||||
for (i = 0; i < dec_size; i++)
|
||||
s->y_buffer[i*2+1] = (s->y_buffer[i*2+1] + (s->scratch_buffer[i] << 1)) & 0x3F;
|
||||
}
|
||||
|
@@ -439,7 +439,7 @@ static int v4l2_set_parameters(AVFormatContext *s1, AVFormatParameters *ap)
|
||||
struct v4l2_streamparm streamparm = {0};
|
||||
struct v4l2_fract *tpf = &streamparm.parm.capture.timeperframe;
|
||||
int i, ret;
|
||||
AVRational fps;
|
||||
AVRational fps={0};
|
||||
|
||||
streamparm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||||
|
||||
|
@@ -69,16 +69,13 @@ static int query_formats(AVFilterContext *ctx)
|
||||
PIX_FMT_BGR555BE, PIX_FMT_BGR555LE,
|
||||
PIX_FMT_GRAY16BE, PIX_FMT_GRAY16LE,
|
||||
PIX_FMT_YUV420P16LE, PIX_FMT_YUV420P16BE,
|
||||
PIX_FMT_YUV422P16LE, PIX_FMT_YUV422P16BE,
|
||||
PIX_FMT_YUV444P16LE, PIX_FMT_YUV444P16BE,
|
||||
PIX_FMT_NV12, PIX_FMT_NV21,
|
||||
PIX_FMT_RGB8, PIX_FMT_BGR8,
|
||||
PIX_FMT_RGB4_BYTE, PIX_FMT_BGR4_BYTE,
|
||||
PIX_FMT_YUV444P, PIX_FMT_YUV422P,
|
||||
PIX_FMT_YUV444P, PIX_FMT_YUVJ444P,
|
||||
PIX_FMT_YUV420P, PIX_FMT_YUVJ420P,
|
||||
PIX_FMT_YUV411P, PIX_FMT_YUV410P,
|
||||
PIX_FMT_YUVJ444P, PIX_FMT_YUVJ422P,
|
||||
PIX_FMT_YUV440P, PIX_FMT_YUVJ440P,
|
||||
PIX_FMT_YUV410P,
|
||||
PIX_FMT_YUVA420P, PIX_FMT_GRAY8,
|
||||
PIX_FMT_NONE
|
||||
};
|
||||
@@ -195,6 +192,8 @@ static void end_frame(AVFilterLink *inlink)
|
||||
avfilter_unref_buffer(outpic);
|
||||
}
|
||||
|
||||
static void null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) { }
|
||||
|
||||
AVFilter avfilter_vf_transpose = {
|
||||
.name = "transpose",
|
||||
.description = NULL_IF_CONFIG_SMALL("Transpose input video."),
|
||||
@@ -207,6 +206,7 @@ AVFilter avfilter_vf_transpose = {
|
||||
.inputs = (AVFilterPad[]) {{ .name = "default",
|
||||
.type = AVMEDIA_TYPE_VIDEO,
|
||||
.start_frame = start_frame,
|
||||
.draw_slice = null_draw_slice,
|
||||
.end_frame = end_frame,
|
||||
.min_perms = AV_PERM_READ, },
|
||||
{ .name = NULL}},
|
||||
|
@@ -247,6 +247,7 @@ OBJS-$(CONFIG_RTPDEC) += rdt.o \
|
||||
rtpdec.o \
|
||||
rtpdec_amr.o \
|
||||
rtpdec_asf.o \
|
||||
rtpdec_g726.o \
|
||||
rtpdec_h263.o \
|
||||
rtpdec_h264.o \
|
||||
rtpdec_latm.o \
|
||||
|
@@ -40,6 +40,8 @@ static int ac3_eac3_probe(AVProbeData *p, enum CodecID expected_codec_id)
|
||||
buf2 = buf;
|
||||
|
||||
for(frames = 0; buf2 < end; frames++) {
|
||||
if(!memcmp(buf2, "\x1\x10\0\0\0\0\0\0", 8))
|
||||
buf2+=16;
|
||||
init_get_bits(&gbc, buf2, 54);
|
||||
if(ff_ac3_parse_header(&gbc, &hdr) < 0)
|
||||
break;
|
||||
|
@@ -808,6 +808,10 @@ static int asf_read_frame_header(AVFormatContext *s, AVIOContext *pb){
|
||||
DO_2BITS(asf->packet_property >> 2, asf->packet_frag_offset, 0);
|
||||
DO_2BITS(asf->packet_property, asf->packet_replic_size, 0);
|
||||
//printf("key:%d stream:%d seq:%d offset:%d replic_size:%d\n", asf->packet_key_frame, asf->stream_index, asf->packet_seq, //asf->packet_frag_offset, asf->packet_replic_size);
|
||||
if (rsize+asf->packet_replic_size > asf->packet_size_left) {
|
||||
av_log(s, AV_LOG_ERROR, "packet_replic_size %d is invalid\n", asf->packet_replic_size);
|
||||
return -1;
|
||||
}
|
||||
if (asf->packet_replic_size >= 8) {
|
||||
asf->packet_obj_size = avio_rl32(pb);
|
||||
if(asf->packet_obj_size >= (1<<24) || asf->packet_obj_size <= 0){
|
||||
@@ -842,10 +846,6 @@ static int asf_read_frame_header(AVFormatContext *s, AVIOContext *pb){
|
||||
av_log(s, AV_LOG_ERROR, "unexpected packet_replic_size of %d\n", asf->packet_replic_size);
|
||||
return -1;
|
||||
}
|
||||
if (rsize > asf->packet_size_left) {
|
||||
av_log(s, AV_LOG_ERROR, "packet_replic_size is invalid\n");
|
||||
return -1;
|
||||
}
|
||||
if (asf->packet_flags & 0x01) {
|
||||
DO_2BITS(asf->packet_segsizetype >> 6, asf->packet_frag_size, 0); // 0 is illegal
|
||||
if (rsize > asf->packet_size_left) {
|
||||
|
@@ -1152,6 +1152,7 @@ AVFormatContext *avformat_alloc_output_context(const char *format,
|
||||
int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oformat,
|
||||
const char *format_name, const char *filename);
|
||||
|
||||
#if FF_API_FORMAT_PARAMETERS
|
||||
/**
|
||||
* Read packets of a media file to get stream information. This
|
||||
* is useful for file formats with no headers such as MPEG. This
|
||||
@@ -1164,8 +1165,34 @@ int avformat_alloc_output_context2(AVFormatContext **ctx, AVOutputFormat *oforma
|
||||
* @return >=0 if OK, AVERROR_xxx on error
|
||||
* @todo Let the user decide somehow what information is needed so that
|
||||
* we do not waste time getting stuff the user does not need.
|
||||
*
|
||||
* @deprecated use avformat_find_stream_info.
|
||||
*/
|
||||
int av_find_stream_info(AVFormatContext *ic);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Read packets of a media file to get stream information. This
|
||||
* is useful for file formats with no headers such as MPEG. This
|
||||
* function also computes the real framerate in case of MPEG-2 repeat
|
||||
* frame mode.
|
||||
* The logical file position is not changed by this function;
|
||||
* examined packets may be buffered for later processing.
|
||||
*
|
||||
* @param ic media file handle
|
||||
* @param options If non-NULL, an ic.nb_streams long array of pointers to
|
||||
* dictionaries, where i-th member contains options for
|
||||
* codec corresponding to i-th stream.
|
||||
* On return each dictionary will be filled with options that were not found.
|
||||
* @return >=0 if OK, AVERROR_xxx on error
|
||||
*
|
||||
* @note this function isn't guaranteed to open all the codecs, so
|
||||
* options being non-empty at return is a perfectly normal behavior.
|
||||
*
|
||||
* @todo Let the user decide somehow what information is needed so that
|
||||
* we do not waste time getting stuff the user does not need.
|
||||
*/
|
||||
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);
|
||||
|
||||
/**
|
||||
* Find the "best" stream in the file.
|
||||
|
@@ -778,13 +778,14 @@ int avio_get_str(AVIOContext *s, int maxlen, char *buf, int buflen)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (buflen <= 0)
|
||||
return AVERROR(EINVAL);
|
||||
// reserve 1 byte for terminating 0
|
||||
buflen = FFMIN(buflen - 1, maxlen);
|
||||
for (i = 0; i < buflen; i++)
|
||||
if (!(buf[i] = avio_r8(s)))
|
||||
return i + 1;
|
||||
if (buflen)
|
||||
buf[i] = 0;
|
||||
buf[i] = 0;
|
||||
for (; i < maxlen; i++)
|
||||
if (!avio_r8(s))
|
||||
return i + 1;
|
||||
@@ -796,6 +797,8 @@ int avio_get_str(AVIOContext *s, int maxlen, char *buf, int buflen)
|
||||
{\
|
||||
char* q = buf;\
|
||||
int ret = 0;\
|
||||
if (buflen <= 0) \
|
||||
return AVERROR(EINVAL); \
|
||||
while (ret + 1 < maxlen) {\
|
||||
uint8_t tmp;\
|
||||
uint32_t ch;\
|
||||
|
@@ -210,7 +210,7 @@ static int amf_parse_object(AVFormatContext *s, AVStream *astream, AVStream *vst
|
||||
case AMF_DATA_TYPE_OBJECT: {
|
||||
unsigned int keylen;
|
||||
|
||||
if (ioc->seekable && key && !strcmp(KEYFRAMES_TAG, key) && depth == 1)
|
||||
if (vstream && ioc->seekable && key && !strcmp(KEYFRAMES_TAG, key) && depth == 1)
|
||||
if (parse_keyframes_index(s, ioc, vstream, max_pos) < 0)
|
||||
av_log(s, AV_LOG_ERROR, "Keyframe index parsing failed\n");
|
||||
|
||||
|
@@ -1811,7 +1811,7 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data,
|
||||
lace_size[n] = lace_size[n - 1] + snum;
|
||||
total += lace_size[n];
|
||||
}
|
||||
lace_size[n] = size - total;
|
||||
lace_size[laces - 1] = size - total;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@@ -1209,7 +1209,6 @@ AVOutputFormat ff_matroska_muxer = {
|
||||
mkv_write_packet,
|
||||
mkv_write_trailer,
|
||||
.flags = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS,
|
||||
.codec_tag = (const AVCodecTag* const []){ff_codec_bmp_tags, ff_codec_wav_tags, 0},
|
||||
.subtitle_codec = CODEC_ID_TEXT,
|
||||
};
|
||||
#endif
|
||||
@@ -1243,6 +1242,5 @@ AVOutputFormat ff_matroska_audio_muxer = {
|
||||
mkv_write_packet,
|
||||
mkv_write_trailer,
|
||||
.flags = AVFMT_GLOBALHEADER,
|
||||
.codec_tag = (const AVCodecTag* const []){ff_codec_wav_tags, 0},
|
||||
};
|
||||
#endif
|
||||
|
@@ -2402,14 +2402,21 @@ static void mov_read_chapters(AVFormatContext *s)
|
||||
// The samples could theoretically be in any encoding if there's an encd
|
||||
// atom following, but in practice are only utf-8 or utf-16, distinguished
|
||||
// instead by the presence of a BOM
|
||||
ch = avio_rb16(sc->pb);
|
||||
if (ch == 0xfeff)
|
||||
avio_get_str16be(sc->pb, len, title, title_len);
|
||||
else if (ch == 0xfffe)
|
||||
avio_get_str16le(sc->pb, len, title, title_len);
|
||||
else {
|
||||
AV_WB16(title, ch);
|
||||
get_strz(sc->pb, title + 2, len - 1);
|
||||
if (!len) {
|
||||
title[0] = 0;
|
||||
} else {
|
||||
ch = avio_rb16(sc->pb);
|
||||
if (ch == 0xfeff)
|
||||
avio_get_str16be(sc->pb, len, title, title_len);
|
||||
else if (ch == 0xfffe)
|
||||
avio_get_str16le(sc->pb, len, title, title_len);
|
||||
else {
|
||||
AV_WB16(title, ch);
|
||||
if (len == 1 || len == 2)
|
||||
title[len] = 0;
|
||||
else
|
||||
get_strz(sc->pb, title + 2, len - 1);
|
||||
}
|
||||
}
|
||||
|
||||
ff_new_chapter(s, i, st->time_base, sample->timestamp, end, title);
|
||||
|
@@ -51,11 +51,12 @@ static int id3v1_create_tag(AVFormatContext *s, uint8_t *buf)
|
||||
buf[0] = 'T';
|
||||
buf[1] = 'A';
|
||||
buf[2] = 'G';
|
||||
count += id3v1_set_string(s, "TIT2", buf + 3, 30); //title
|
||||
count += id3v1_set_string(s, "TPE1", buf + 33, 30); //author|artist
|
||||
count += id3v1_set_string(s, "TALB", buf + 63, 30); //album
|
||||
count += id3v1_set_string(s, "TDRL", buf + 93, 4); //date
|
||||
count += id3v1_set_string(s, "comment", buf + 97, 30);
|
||||
/* we knowingly overspecify each tag length by one byte to compensate for the mandatory null byte added by av_strlcpy */
|
||||
count += id3v1_set_string(s, "TIT2", buf + 3, 30 + 1); //title
|
||||
count += id3v1_set_string(s, "TPE1", buf + 33, 30 + 1); //author|artist
|
||||
count += id3v1_set_string(s, "TALB", buf + 63, 30 + 1); //album
|
||||
count += id3v1_set_string(s, "TDRL", buf + 93, 4 + 1); //date
|
||||
count += id3v1_set_string(s, "comment", buf + 97, 30 + 1);
|
||||
if ((tag = av_dict_get(s->metadata, "TRCK", NULL, 0))) { //track
|
||||
buf[125] = 0;
|
||||
buf[126] = atoi(tag->value);
|
||||
|
@@ -1083,7 +1083,7 @@ static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len
|
||||
|
||||
// stop parsing after pmt, we found header
|
||||
if (!ts->stream->nb_streams)
|
||||
ts->stop_parse = 1;
|
||||
ts->stop_parse = 2;
|
||||
|
||||
for(;;) {
|
||||
st = 0;
|
||||
@@ -1403,11 +1403,15 @@ static int handle_packets(MpegTSContext *ts, int nb_packets)
|
||||
ts->stop_parse = 0;
|
||||
packet_num = 0;
|
||||
for(;;) {
|
||||
if (ts->stop_parse>0)
|
||||
break;
|
||||
packet_num++;
|
||||
if (nb_packets != 0 && packet_num >= nb_packets)
|
||||
if (nb_packets != 0 && packet_num >= nb_packets ||
|
||||
ts->stop_parse > 1) {
|
||||
ret = AVERROR(EAGAIN);
|
||||
break;
|
||||
}
|
||||
if (ts->stop_parse > 0)
|
||||
break;
|
||||
|
||||
ret = read_packet(s, packet, ts->raw_packet_size);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
@@ -1858,10 +1862,8 @@ int ff_mpegts_parse_packet(MpegTSContext *ts, AVPacket *pkt,
|
||||
|
||||
len1 = len;
|
||||
ts->pkt = pkt;
|
||||
ts->stop_parse = 0;
|
||||
for(;;) {
|
||||
if (ts->stop_parse>0)
|
||||
break;
|
||||
ts->stop_parse = 0;
|
||||
if (len < TS_PACKET_SIZE)
|
||||
return -1;
|
||||
if (buf[0] != 0x47) {
|
||||
@@ -1871,6 +1873,8 @@ int ff_mpegts_parse_packet(MpegTSContext *ts, AVPacket *pkt,
|
||||
handle_packet(ts, buf);
|
||||
buf += TS_PACKET_SIZE;
|
||||
len -= TS_PACKET_SIZE;
|
||||
if (ts->stop_parse == 1)
|
||||
break;
|
||||
}
|
||||
}
|
||||
return len1 - len;
|
||||
|
@@ -84,7 +84,7 @@ static const AVOption options[] = {
|
||||
{ "mpegts_service_id", "Set service_id field.",
|
||||
offsetof(MpegTSWrite, service_id), FF_OPT_TYPE_INT, {.dbl = 0x0001 }, 0x0001, 0xffff, AV_OPT_FLAG_ENCODING_PARAM},
|
||||
{ "mpegts_pmt_start_pid", "Set the first pid of the PMT.",
|
||||
offsetof(MpegTSWrite, pmt_start_pid), FF_OPT_TYPE_INT, {.dbl = 0x1000 }, 0x1000, 0x1f00, AV_OPT_FLAG_ENCODING_PARAM},
|
||||
offsetof(MpegTSWrite, pmt_start_pid), FF_OPT_TYPE_INT, {.dbl = 0x1000 }, 0x0010, 0x1f00, AV_OPT_FLAG_ENCODING_PARAM},
|
||||
{ "mpegts_start_pid", "Set the first pid.",
|
||||
offsetof(MpegTSWrite, start_pid), FF_OPT_TYPE_INT, {.dbl = 0x0100 }, 0x0100, 0x0f00, AV_OPT_FLAG_ENCODING_PARAM},
|
||||
{ NULL },
|
||||
|
@@ -223,12 +223,13 @@ static int mxf_get_d10_aes3_packet(AVIOContext *pb, AVStream *st, AVPacket *pkt,
|
||||
|
||||
if (length > 61444) /* worst case PAL 1920 samples 8 channels */
|
||||
return -1;
|
||||
av_new_packet(pkt, length);
|
||||
avio_read(pb, pkt->data, length);
|
||||
length = av_get_packet(pb, pkt, length);
|
||||
if (length < 0)
|
||||
return length;
|
||||
data_ptr = pkt->data;
|
||||
end_ptr = pkt->data + length;
|
||||
buf_ptr = pkt->data + 4; /* skip SMPTE 331M header */
|
||||
for (; buf_ptr < end_ptr; ) {
|
||||
for (; buf_ptr + st->codec->channels*4 < end_ptr; ) {
|
||||
for (i = 0; i < st->codec->channels; i++) {
|
||||
uint32_t sample = bytestream_get_le32(&buf_ptr);
|
||||
if (st->codec->bits_per_coded_sample == 24)
|
||||
@@ -238,7 +239,7 @@ static int mxf_get_d10_aes3_packet(AVIOContext *pb, AVStream *st, AVPacket *pkt,
|
||||
}
|
||||
buf_ptr += 32 - st->codec->channels*4; // always 8 channels stored SMPTE 331M
|
||||
}
|
||||
pkt->size = data_ptr - pkt->data;
|
||||
av_shrink_packet(pkt, data_ptr - pkt->data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -290,12 +291,16 @@ static int mxf_decrypt_triplet(AVFormatContext *s, AVPacket *pkt, KLVPacket *klv
|
||||
if (memcmp(tmpbuf, checkv, 16))
|
||||
av_log(s, AV_LOG_ERROR, "probably incorrect decryption key\n");
|
||||
size -= 32;
|
||||
av_get_packet(pb, pkt, size);
|
||||
size = av_get_packet(pb, pkt, size);
|
||||
if (size < 0)
|
||||
return size;
|
||||
else if (size < plaintext_size)
|
||||
return AVERROR_INVALIDDATA;
|
||||
size -= plaintext_size;
|
||||
if (mxf->aesc)
|
||||
av_aes_crypt(mxf->aesc, &pkt->data[plaintext_size],
|
||||
&pkt->data[plaintext_size], size >> 4, ivec, 1);
|
||||
pkt->size = orig_size;
|
||||
av_shrink_packet(pkt, orig_size);
|
||||
pkt->stream_index = index;
|
||||
avio_skip(pb, end - avio_tell(pb));
|
||||
return 0;
|
||||
@@ -332,8 +337,11 @@ static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
av_log(s, AV_LOG_ERROR, "error reading D-10 aes3 frame\n");
|
||||
return -1;
|
||||
}
|
||||
} else
|
||||
av_get_packet(s->pb, pkt, klv.length);
|
||||
} else {
|
||||
int ret = av_get_packet(s->pb, pkt, klv.length);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
pkt->stream_index = index;
|
||||
pkt->pos = klv.offset;
|
||||
return 0;
|
||||
|
@@ -59,6 +59,12 @@ int ff_raw_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
||||
|
||||
if (s1->sample_rate)
|
||||
st->codec->sample_rate = s1->sample_rate;
|
||||
if (st->codec->sample_rate <= 0) {
|
||||
av_log(s, AV_LOG_WARNING, "Invalid sample rate %d specified using default of 44100\n",
|
||||
st->codec->sample_rate);
|
||||
st->codec->sample_rate= 44100;
|
||||
}
|
||||
|
||||
if (s1->channels)
|
||||
st->codec->channels = s1->channels;
|
||||
|
||||
@@ -246,7 +252,7 @@ AVInputFormat ff_gsm_demuxer = {
|
||||
#endif
|
||||
|
||||
#if CONFIG_MJPEG_DEMUXER
|
||||
FF_DEF_RAWVIDEO_DEMUXER(mjpeg, "raw MJPEG video", NULL, "mjpg,mjpeg", CODEC_ID_MJPEG)
|
||||
FF_DEF_RAWVIDEO_DEMUXER(mjpeg, "raw MJPEG video", NULL, "mjpg,mjpeg,mpo", CODEC_ID_MJPEG)
|
||||
#endif
|
||||
|
||||
#if CONFIG_MLP_DEMUXER
|
||||
|
@@ -287,6 +287,7 @@ const AVCodecTag ff_codec_wav_tags[] = {
|
||||
{ CODEC_ID_ADPCM_YAMAHA, 0x0020 },
|
||||
{ CODEC_ID_TRUESPEECH, 0x0022 },
|
||||
{ CODEC_ID_GSM_MS, 0x0031 },
|
||||
{ CODEC_ID_AMR_NB, 0x0038 }, /* rogue format number */
|
||||
{ CODEC_ID_ADPCM_G726, 0x0045 },
|
||||
{ CODEC_ID_MP2, 0x0050 },
|
||||
{ CODEC_ID_MP3, 0x0055 },
|
||||
|
@@ -82,6 +82,11 @@ void av_register_rtp_dynamic_payload_handlers(void)
|
||||
ff_register_dynamic_payload_handler(&ff_qt_rtp_vid_handler);
|
||||
ff_register_dynamic_payload_handler(&ff_quicktime_rtp_aud_handler);
|
||||
ff_register_dynamic_payload_handler(&ff_quicktime_rtp_vid_handler);
|
||||
|
||||
ff_register_dynamic_payload_handler(&ff_g726_16_dynamic_handler);
|
||||
ff_register_dynamic_payload_handler(&ff_g726_24_dynamic_handler);
|
||||
ff_register_dynamic_payload_handler(&ff_g726_32_dynamic_handler);
|
||||
ff_register_dynamic_payload_handler(&ff_g726_40_dynamic_handler);
|
||||
}
|
||||
|
||||
RTPDynamicProtocolHandler *ff_rtp_handler_find_by_name(const char *name,
|
||||
@@ -111,14 +116,15 @@ RTPDynamicProtocolHandler *ff_rtp_handler_find_by_id(int id,
|
||||
static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf, int len)
|
||||
{
|
||||
int payload_len;
|
||||
while (len >= 2) {
|
||||
while (len >= 4) {
|
||||
payload_len = FFMIN(len, (AV_RB16(buf + 2) + 1) * 4);
|
||||
|
||||
switch (buf[1]) {
|
||||
case RTCP_SR:
|
||||
if (len < 16) {
|
||||
if (payload_len < 20) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Invalid length for RTCP SR packet\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
payload_len = (AV_RB16(buf + 2) + 1) * 4;
|
||||
|
||||
s->last_rtcp_ntp_time = AV_RB64(buf + 8);
|
||||
s->last_rtcp_timestamp = AV_RB32(buf + 16);
|
||||
@@ -129,14 +135,13 @@ static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf, int l
|
||||
s->rtcp_ts_offset = s->last_rtcp_timestamp - s->base_timestamp;
|
||||
}
|
||||
|
||||
buf += payload_len;
|
||||
len -= payload_len;
|
||||
break;
|
||||
case RTCP_BYE:
|
||||
return -RTCP_BYE;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
buf += payload_len;
|
||||
len -= payload_len;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
@@ -33,6 +33,10 @@ int ff_wms_parse_sdp_a_line(AVFormatContext *s, const char *p);
|
||||
|
||||
extern RTPDynamicProtocolHandler ff_amr_nb_dynamic_handler;
|
||||
extern RTPDynamicProtocolHandler ff_amr_wb_dynamic_handler;
|
||||
extern RTPDynamicProtocolHandler ff_g726_16_dynamic_handler;
|
||||
extern RTPDynamicProtocolHandler ff_g726_24_dynamic_handler;
|
||||
extern RTPDynamicProtocolHandler ff_g726_32_dynamic_handler;
|
||||
extern RTPDynamicProtocolHandler ff_g726_40_dynamic_handler;
|
||||
extern RTPDynamicProtocolHandler ff_h263_1998_dynamic_handler;
|
||||
extern RTPDynamicProtocolHandler ff_h263_2000_dynamic_handler;
|
||||
extern RTPDynamicProtocolHandler ff_h264_dynamic_handler;
|
||||
|
94
libavformat/rtpdec_g726.c
Normal file
94
libavformat/rtpdec_g726.c
Normal file
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
* Copyright (c) 2011 Miroslav Slugeň <Thunder.m@seznam.cz>
|
||||
*
|
||||
* This file is part of FFmpeg.
|
||||
*
|
||||
* FFmpeg is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* FFmpeg is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with FFmpeg; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include "avformat.h"
|
||||
#include "rtpdec_formats.h"
|
||||
|
||||
static int g726_16_parse_sdp_line(AVFormatContext *s, int st_index,
|
||||
PayloadContext *data, const char *line)
|
||||
{
|
||||
AVStream *stream = s->streams[st_index];
|
||||
AVCodecContext *codec = stream->codec;
|
||||
|
||||
codec->bit_rate = 16000;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int g726_24_parse_sdp_line(AVFormatContext *s, int st_index,
|
||||
PayloadContext *data, const char *line)
|
||||
{
|
||||
AVStream *stream = s->streams[st_index];
|
||||
AVCodecContext *codec = stream->codec;
|
||||
|
||||
codec->bit_rate = 24000;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int g726_32_parse_sdp_line(AVFormatContext *s, int st_index,
|
||||
PayloadContext *data, const char *line)
|
||||
{
|
||||
AVStream *stream = s->streams[st_index];
|
||||
AVCodecContext *codec = stream->codec;
|
||||
|
||||
codec->bit_rate = 32000;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int g726_40_parse_sdp_line(AVFormatContext *s, int st_index,
|
||||
PayloadContext *data, const char *line)
|
||||
{
|
||||
AVStream *stream = s->streams[st_index];
|
||||
AVCodecContext *codec = stream->codec;
|
||||
|
||||
codec->bit_rate = 40000;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
RTPDynamicProtocolHandler ff_g726_16_dynamic_handler = {
|
||||
.enc_name = "G726-16",
|
||||
.codec_type = AVMEDIA_TYPE_AUDIO,
|
||||
.codec_id = CODEC_ID_ADPCM_G726,
|
||||
.parse_sdp_a_line = g726_16_parse_sdp_line,
|
||||
};
|
||||
|
||||
RTPDynamicProtocolHandler ff_g726_24_dynamic_handler = {
|
||||
.enc_name = "G726-24",
|
||||
.codec_type = AVMEDIA_TYPE_AUDIO,
|
||||
.codec_id = CODEC_ID_ADPCM_G726,
|
||||
.parse_sdp_a_line = g726_24_parse_sdp_line,
|
||||
};
|
||||
|
||||
RTPDynamicProtocolHandler ff_g726_32_dynamic_handler = {
|
||||
.enc_name = "G726-32",
|
||||
.codec_type = AVMEDIA_TYPE_AUDIO,
|
||||
.codec_id = CODEC_ID_ADPCM_G726,
|
||||
.parse_sdp_a_line = g726_32_parse_sdp_line,
|
||||
};
|
||||
|
||||
RTPDynamicProtocolHandler ff_g726_40_dynamic_handler = {
|
||||
.enc_name = "G726-40",
|
||||
.codec_type = AVMEDIA_TYPE_AUDIO,
|
||||
.codec_id = CODEC_ID_ADPCM_G726,
|
||||
.parse_sdp_a_line = g726_40_parse_sdp_line,
|
||||
};
|
@@ -107,6 +107,10 @@ static int tta_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
||||
return -1;
|
||||
}
|
||||
st->codec->extradata = av_mallocz(st->codec->extradata_size+FF_INPUT_BUFFER_PADDING_SIZE);
|
||||
if (!st->codec->extradata) {
|
||||
st->codec->extradata_size = 0;
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
avio_seek(s->pb, start_offset, SEEK_SET);
|
||||
avio_read(s->pb, st->codec->extradata, st->codec->extradata_size);
|
||||
|
||||
|
@@ -2121,7 +2121,7 @@ static int has_decode_delay_been_guessed(AVStream *st)
|
||||
st->codec_info_nb_frames >= 6 + st->codec->has_b_frames;
|
||||
}
|
||||
|
||||
static int try_decode_frame(AVStream *st, AVPacket *avpkt)
|
||||
static int try_decode_frame(AVStream *st, AVPacket *avpkt, AVDictionary **options)
|
||||
{
|
||||
int16_t *samples;
|
||||
AVCodec *codec;
|
||||
@@ -2132,7 +2132,7 @@ static int try_decode_frame(AVStream *st, AVPacket *avpkt)
|
||||
codec = avcodec_find_decoder(st->codec->codec_id);
|
||||
if (!codec)
|
||||
return -1;
|
||||
ret = avcodec_open(st->codec, codec);
|
||||
ret = avcodec_open2(st->codec, codec, options);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
@@ -2251,12 +2251,20 @@ static int tb_unreliable(AVCodecContext *c){
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if FF_API_FORMAT_PARAMETERS
|
||||
int av_find_stream_info(AVFormatContext *ic)
|
||||
{
|
||||
return avformat_find_stream_info(ic, NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
|
||||
{
|
||||
int i, count, ret, read_size, j;
|
||||
AVStream *st;
|
||||
AVPacket pkt1, *pkt;
|
||||
int64_t old_offset = avio_tell(ic->pb);
|
||||
int orig_nb_streams = ic->nb_streams; // new streams might appear, no options for those
|
||||
|
||||
for(i=0;i<ic->nb_streams;i++) {
|
||||
AVCodec *codec;
|
||||
@@ -2293,12 +2301,12 @@ int av_find_stream_info(AVFormatContext *ic)
|
||||
/* Ensure that subtitle_header is properly set. */
|
||||
if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
|
||||
&& codec && !st->codec->codec)
|
||||
avcodec_open(st->codec, codec);
|
||||
avcodec_open2(st->codec, codec, options ? &options[i] : NULL);
|
||||
|
||||
//try to just open decoders, in case this is enough to get parameters
|
||||
if(!has_codec_parameters(st->codec)){
|
||||
if (codec && !st->codec->codec)
|
||||
avcodec_open(st->codec, codec);
|
||||
avcodec_open2(st->codec, codec, options ? &options[i] : NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2396,9 +2404,9 @@ int av_find_stream_info(AVFormatContext *ic)
|
||||
}
|
||||
{
|
||||
int64_t last = st->info->last_dts;
|
||||
int64_t duration= pkt->dts - last;
|
||||
|
||||
if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && duration>0){
|
||||
if(pkt->dts != AV_NOPTS_VALUE && last != AV_NOPTS_VALUE && pkt->dts > last){
|
||||
int64_t duration= pkt->dts - last;
|
||||
double dur= duration * av_q2d(st->time_base);
|
||||
|
||||
// if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
|
||||
@@ -2408,7 +2416,7 @@ int av_find_stream_info(AVFormatContext *ic)
|
||||
for (i=1; i<FF_ARRAY_ELEMS(st->info->duration_error); i++) {
|
||||
int framerate= get_std_framerate(i);
|
||||
int ticks= lrintf(dur*framerate/(1001*12));
|
||||
double error= dur - ticks*1001*12/(double)framerate;
|
||||
double error = dur - (double)ticks*1001*12 / framerate;
|
||||
st->info->duration_error[i] += error*error;
|
||||
}
|
||||
st->info->duration_count++;
|
||||
@@ -2434,7 +2442,7 @@ int av_find_stream_info(AVFormatContext *ic)
|
||||
it takes longer and uses more memory. For MPEG-4, we need to
|
||||
decompress for QuickTime. */
|
||||
if (!has_codec_parameters(st->codec) || !has_decode_delay_been_guessed(st))
|
||||
try_decode_frame(st, pkt);
|
||||
try_decode_frame(st, pkt, (options && i < orig_nb_streams )? &options[i] : NULL);
|
||||
|
||||
st->codec_info_nb_frames++;
|
||||
count++;
|
||||
@@ -2959,7 +2967,7 @@ int avformat_write_header(AVFormatContext *s, AVDictionary **options)
|
||||
goto fail;
|
||||
}
|
||||
if(av_cmp_q(st->sample_aspect_ratio, st->codec->sample_aspect_ratio)
|
||||
&& FFABS(av_q2d(st->sample_aspect_ratio) - av_q2d(st->codec->sample_aspect_ratio)) > 0.001
|
||||
&& FFABS(av_q2d(st->sample_aspect_ratio) - av_q2d(st->codec->sample_aspect_ratio)) > 0.004*av_q2d(st->sample_aspect_ratio)
|
||||
){
|
||||
av_log(s, AV_LOG_ERROR, "Aspect ratio mismatch between encoder and muxer layer\n");
|
||||
ret = AVERROR(EINVAL);
|
||||
|
@@ -24,7 +24,7 @@
|
||||
#include "libavutil/avutil.h"
|
||||
|
||||
#define LIBAVFORMAT_VERSION_MAJOR 53
|
||||
#define LIBAVFORMAT_VERSION_MINOR 4
|
||||
#define LIBAVFORMAT_VERSION_MINOR 5
|
||||
#define LIBAVFORMAT_VERSION_MICRO 0
|
||||
|
||||
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
|
||||
|
@@ -277,10 +277,8 @@ static int wsvqa_read_header(AVFormatContext *s,
|
||||
/* there are 0 or more chunks before the FINF chunk; iterate until
|
||||
* FINF has been skipped and the file will be ready to be demuxed */
|
||||
do {
|
||||
if (avio_read(pb, scratch, VQA_PREAMBLE_SIZE) != VQA_PREAMBLE_SIZE) {
|
||||
av_free(st->codec->extradata);
|
||||
if (avio_read(pb, scratch, VQA_PREAMBLE_SIZE) != VQA_PREAMBLE_SIZE)
|
||||
return AVERROR(EIO);
|
||||
}
|
||||
chunk_tag = AV_RB32(&scratch[0]);
|
||||
chunk_size = AV_RB32(&scratch[4]);
|
||||
|
||||
|
@@ -104,7 +104,7 @@ static av_always_inline av_const int32_t av_clipl_int32_arm(int64_t a)
|
||||
"mvnne %1, #1<<31 \n\t"
|
||||
"moveq %0, %Q2 \n\t"
|
||||
"eorne %0, %1, %R2, asr #31 \n\t"
|
||||
: "=r"(x), "=&r"(y) : "r"(a));
|
||||
: "=r"(x), "=&r"(y) : "r"(a):"cc");
|
||||
return x;
|
||||
}
|
||||
|
||||
|
@@ -57,7 +57,7 @@ static AVCRC av_crc_table[AV_CRC_MAX][257];
|
||||
* @return <0 on failure
|
||||
*/
|
||||
int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size){
|
||||
int i, j;
|
||||
unsigned i, j;
|
||||
uint32_t c;
|
||||
|
||||
if (bits < 8 || bits > 32 || poly >= (1LL<<bits))
|
||||
|
@@ -125,7 +125,7 @@ int av_image_fill_pointers(uint8_t *data[4], enum PixelFormat pix_fmt, int heigh
|
||||
has_plane[desc->comp[i].plane] = 1;
|
||||
|
||||
total_size = size[0];
|
||||
for (i = 1; has_plane[i] && i < 4; i++) {
|
||||
for (i = 1; i < 4 && has_plane[i]; i++) {
|
||||
int h, s = (i == 1 || i == 2) ? desc->log2_chroma_h : 0;
|
||||
data[i] = data[i-1] + size[i-1];
|
||||
h = (height + (1 << s) - 1) >> s;
|
||||
|
@@ -175,11 +175,11 @@ int av_lzo1x_decode(void *out, int *outlen, const void *in, int *inlen) {
|
||||
int state= 0;
|
||||
int x;
|
||||
LZOContext c;
|
||||
if (!*outlen || !*inlen) {
|
||||
if (*outlen <= 0 || *inlen <= 0) {
|
||||
int res = 0;
|
||||
if (!*outlen)
|
||||
if (*outlen <= 0)
|
||||
res |= AV_LZO_OUTPUT_FULL;
|
||||
if (!*inlen)
|
||||
if (*inlen <= 0)
|
||||
res |= AV_LZO_INPUT_DEPLETED;
|
||||
return res;
|
||||
}
|
||||
|
@@ -137,7 +137,9 @@ void *av_realloc(void *ptr, size_t size)
|
||||
//FIXME this isn't aligned correctly, though it probably isn't needed
|
||||
if(!ptr) return av_malloc(size);
|
||||
diff= ((char*)ptr)[-1];
|
||||
return (char*)realloc((char*)ptr - diff, size + diff) + diff;
|
||||
ptr= realloc((char*)ptr - diff, size + diff);
|
||||
if(ptr) ptr = (char*)ptr + diff;
|
||||
return ptr;
|
||||
#else
|
||||
return realloc(ptr, size + !size);
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user