Compare commits
273 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4169912f39 | |||
| 3b18d820cc | |||
| c9d12a4692 | |||
| 7ca2ed716d | |||
| 4f85e7b6ec | |||
| 10848d0862 | |||
| b6cc1c77fd | |||
| 808686375d | |||
| bc5d86d23d | |||
| 1687c55e24 | |||
| fd53da21a1 | |||
| a0b65938b7 | |||
| cb8a17ddac | |||
| 24eabc53ba | |||
| 6fe5038753 | |||
| 6ae95a0b93 | |||
| 96ed18cab1 | |||
| a207a2fecc | |||
| f728ad26f0 | |||
| e676bbb8cf | |||
| 847c7cd0c8 | |||
| 137007b5bf | |||
| 90db3c435e | |||
| 8b819fd9d3 | |||
| 81c5b4ddcb | |||
| 5ae49ddaa4 | |||
| 311361348d | |||
| 99536be9d4 | |||
| bbe316dfb4 | |||
| b4a223fd19 | |||
| 4924520513 | |||
| f2e412d050 | |||
| 6dfe865aed | |||
| 853ce33dbc | |||
| 5015ada0ec | |||
| 4be63587e1 | |||
| a642953b0f | |||
| f5ce67d837 | |||
| b0888b8a48 | |||
| 2c199cb253 | |||
| 00fa6ffe1a | |||
| 44e182d41e | |||
| bb737d381f | |||
| 0100c4b1b0 | |||
| be524c186b | |||
| 65beb8c117 | |||
| f375e19f37 | |||
| 54e947273c | |||
| e3e05963c1 | |||
| bd37b95383 | |||
| 58133bb010 | |||
| 43e3e7764c | |||
| 74bd46e82a | |||
| c932844882 | |||
| 433aaeb2f1 | |||
| 88b47010c4 | |||
| b56b7b9081 | |||
| bd0d32d131 | |||
| d680295d0c | |||
| ced190c96c | |||
| e15d137ecf | |||
| 87a1169ab8 | |||
| 4f64456a14 | |||
| f28ec73379 | |||
| a2d5e741a8 | |||
| 18caebca4c | |||
| 117b8b00cc | |||
| a02da9ceaf | |||
| 811989e910 | |||
| 678737c26b | |||
| 25784c0409 | |||
| d10c22d33c | |||
| b1d9a80863 | |||
| cd6c5e16c6 | |||
| 18b2f23ef8 | |||
| 33149928ed | |||
| 9a331217b0 | |||
| 2380a3d37f | |||
| 4509129e9d | |||
| d031302e0e | |||
| 0fe5321634 | |||
| b2b2dc61fa | |||
| ce99c1bfb5 | |||
| fd3af2950a | |||
| 6c12293f6c | |||
| dd7b323d9a | |||
| bf9f26cef7 | |||
| 0fbde741cb | |||
| ec961c8919 | |||
| 3b5e1494c6 | |||
| ccd528cc32 | |||
| ceeaf42451 | |||
| c321f2abca | |||
| a3d331f2d8 | |||
| 73ad066939 | |||
| 1cc0b08635 | |||
| b3d7fffee3 | |||
| ef7a4df458 | |||
| 3b7a1ba90e | |||
| da73a2005a | |||
| 6b011631e9 | |||
| 5ab326d7db | |||
| 39fd8d0083 | |||
| b3bdefb01b | |||
| 4eb51d96dd | |||
| d75c80e942 | |||
| 34d6f22a57 | |||
| 518c72474d | |||
| 39fed2e95b | |||
| 7fa13e12e6 | |||
| ab201f6f1b | |||
| b696d61518 | |||
| a23bcc923d | |||
| 559261ce49 | |||
| f9d17e6f54 | |||
| 0b1ac7bf4f | |||
| af0a56e6ef | |||
| 5e3ba60e6f | |||
| 48f9a80072 | |||
| 2c99aa48d7 | |||
| fdc669fcbb | |||
| fe3314a413 | |||
| 58afe6061a | |||
| 8c2ae575ad | |||
| 9c78fe9360 | |||
| c98d7882d8 | |||
| e52e85ac3a | |||
| 4faa00b256 | |||
| 90d7146511 | |||
| 59050c0629 | |||
| be2404b06d | |||
| 49007b494e | |||
| 0277c82de2 | |||
| 5fa8e43b54 | |||
| 737bea21b6 | |||
| aa9e308580 | |||
| d57d039e04 | |||
| 97a1ab4bce | |||
| 914b9b0b2b | |||
| 39de0e008d | |||
| f2f2a00d39 | |||
| 905d0633a6 | |||
| 95605595b5 | |||
| fb20141563 | |||
| c5766b55c4 | |||
| d646cce15f | |||
| 04b71cdedd | |||
| fce03f8783 | |||
| 22949c42ed | |||
| 8751941030 | |||
| 3e1b5981ba | |||
| efe3fb13a7 | |||
| 987f5dc55e | |||
| 5bb9ce755b | |||
| ea5a5f0908 | |||
| 619aab2f41 | |||
| 8099d77ca4 | |||
| bb7fd94eeb | |||
| ea311af23d | |||
| 4562f95ba8 | |||
| fc0e151cdc | |||
| 56fe62ec94 | |||
| ce3e0d48f8 | |||
| d46efbebe7 | |||
| 151aaf539f | |||
| f74a4b621f | |||
| 7fc9aa6d35 | |||
| ce80957cf1 | |||
| 74f4c1358c | |||
| 8475df8158 | |||
| 282a1a960a | |||
| 2ba86066be | |||
| 2f62b677cc | |||
| 684f671f28 | |||
| 000bd5209f | |||
| 047c6ad752 | |||
| 6362264e2d | |||
| ccb3b71b42 | |||
| 4ed486dc3a | |||
| ba31a01681 | |||
| 1e809ab887 | |||
| c6bb93dcd9 | |||
| 485f85aa90 | |||
| ec2a1d91e2 | |||
| 958e0f705d | |||
| 734a9bb05f | |||
| 7f62cf120b | |||
| af58dd4798 | |||
| 5c9ca599a7 | |||
| 4a22876675 | |||
| 3a3f2b515f | |||
| 8935e7474a | |||
| 4ad5618210 | |||
| 6b4c38b362 | |||
| 049b08d04c | |||
| 8454d81ebe | |||
| 6f0e349a02 | |||
| 56173eabb6 | |||
| d80db23e7d | |||
| c4cc8584d0 | |||
| 1c1af2af0d | |||
| d4653e882f | |||
| 8f17d7dd4b | |||
| dd8228dcff | |||
| b0283ccb9e | |||
| 97f23c72a3 | |||
| 3b0b8c6531 | |||
| 1f625431e2 | |||
| 4a94678f1b | |||
| c624935554 | |||
| 06df542067 | |||
| 82a11fcff2 | |||
| cee1568ae1 | |||
| c409ac5adc | |||
| 680880c98d | |||
| d75909f247 | |||
| 8413f12e1b | |||
| df825c956a | |||
| d61b38b9db | |||
| d912a30c7d | |||
| 8dba5608dc | |||
| 7ce728050b | |||
| 851098c9e0 | |||
| bba709214a | |||
| 0eca0da06e | |||
| d38580a7bb | |||
| 8acf9905a1 | |||
| 1550c0885d | |||
| 38a511e84c | |||
| ba4b08b789 | |||
| 67a7ed623b | |||
| c76505e0de | |||
| 30c08e2261 | |||
| 7367cbec1b | |||
| 28acce2861 | |||
| 7347205351 | |||
| 0d93d5c461 | |||
| a31ccacb1a | |||
| 494cfacdb9 | |||
| 4f58d8ebc1 | |||
| 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 |
@@ -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.6
|
||||
PROJECT_NUMBER = 0.8.11
|
||||
|
||||
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
|
||||
# base path where the generated documentation will be put.
|
||||
|
||||
@@ -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,
|
||||
|
||||
+2
-2
@@ -1760,9 +1760,9 @@ interlaced video, accepts one of the following values:
|
||||
|
||||
@table @option
|
||||
@item 0
|
||||
assume bottom field first
|
||||
@item 1
|
||||
assume top field first
|
||||
@item 1
|
||||
assume bottom field first
|
||||
@item -1
|
||||
enable automatic detection
|
||||
@end table
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -516,6 +516,7 @@ static int socket_open_listen(struct sockaddr_in *my_addr)
|
||||
tmp = 1;
|
||||
setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &tmp, sizeof(tmp));
|
||||
|
||||
my_addr->sin_family = AF_INET;
|
||||
if (bind (server_fd, (struct sockaddr *) my_addr, sizeof (*my_addr)) < 0) {
|
||||
char bindmsg[32];
|
||||
snprintf(bindmsg, sizeof(bindmsg), "bind(port %d)", ntohs(my_addr->sin_port));
|
||||
|
||||
+7
-4
@@ -694,10 +694,13 @@ static int decode_i_frame(FourXContext *f, const uint8_t *buf, int length){
|
||||
unsigned int prestream_size;
|
||||
const uint8_t *prestream;
|
||||
|
||||
if (bitstream_size > (1<<26) || length < bitstream_size + 12)
|
||||
return -1;
|
||||
prestream_size = 4*AV_RL32(buf + bitstream_size + 4);
|
||||
prestream = buf + bitstream_size + 12;
|
||||
if (length < bitstream_size + 12) {
|
||||
av_log(f->avctx, AV_LOG_ERROR, "packet size too small\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
prestream_size = 4 * AV_RL32(buf + bitstream_size + 4);
|
||||
prestream = buf + bitstream_size + 12;
|
||||
|
||||
if (prestream_size > (1<<26) ||
|
||||
prestream_size != length - (bitstream_size + 12)){
|
||||
|
||||
+13
-12
@@ -754,19 +754,20 @@ static int decode_band_types(AACContext *ac, enum BandType band_type[120],
|
||||
av_log(ac->avctx, AV_LOG_ERROR, "invalid band type\n");
|
||||
return -1;
|
||||
}
|
||||
while ((sect_len_incr = get_bits(gb, bits)) == (1 << bits) - 1)
|
||||
do {
|
||||
sect_len_incr = get_bits(gb, bits);
|
||||
sect_end += sect_len_incr;
|
||||
sect_end += sect_len_incr;
|
||||
if (get_bits_left(gb) < 0) {
|
||||
av_log(ac->avctx, AV_LOG_ERROR, overread_err);
|
||||
return -1;
|
||||
}
|
||||
if (sect_end > ics->max_sfb) {
|
||||
av_log(ac->avctx, AV_LOG_ERROR,
|
||||
"Number of bands (%d) exceeds limit (%d).\n",
|
||||
sect_end, ics->max_sfb);
|
||||
return -1;
|
||||
}
|
||||
if (get_bits_left(gb) < 0) {
|
||||
av_log(ac->avctx, AV_LOG_ERROR, overread_err);
|
||||
return -1;
|
||||
}
|
||||
if (sect_end > ics->max_sfb) {
|
||||
av_log(ac->avctx, AV_LOG_ERROR,
|
||||
"Number of bands (%d) exceeds limit (%d).\n",
|
||||
sect_end, ics->max_sfb);
|
||||
return -1;
|
||||
}
|
||||
} while (sect_len_incr == (1 << bits) - 1);
|
||||
for (; k < sect_end; k++) {
|
||||
band_type [idx] = sect_band_type;
|
||||
band_type_run_end[idx++] = sect_end;
|
||||
|
||||
+1
-1
@@ -1185,7 +1185,7 @@ static void sbr_qmf_synthesis(DSPContext *dsp, FFTContext *mdct,
|
||||
const float *sbr_qmf_window = div ? sbr_qmf_window_ds : sbr_qmf_window_us;
|
||||
float *v;
|
||||
for (i = 0; i < 32; i++) {
|
||||
if (*v_off == 0) {
|
||||
if (*v_off < 128 >> div) {
|
||||
int saved_samples = (1280 - 128) >> div;
|
||||
memcpy(&v0[SBR_SYNTHESIS_BUF_SIZE - saved_samples], v0, saved_samples * sizeof(float));
|
||||
*v_off = SBR_SYNTHESIS_BUF_SIZE - saved_samples - (128 >> div);
|
||||
|
||||
+5
-3
@@ -108,7 +108,7 @@ static void ac3_bit_alloc_calc_bap_c(int16_t *mask, int16_t *psd,
|
||||
int snr_offset, int floor,
|
||||
const uint8_t *bap_tab, uint8_t *bap)
|
||||
{
|
||||
int bin, band;
|
||||
int bin, band, band_end;
|
||||
|
||||
/* special case, if snr offset is -960, set all bap's to zero */
|
||||
if (snr_offset == -960) {
|
||||
@@ -120,12 +120,14 @@ static void ac3_bit_alloc_calc_bap_c(int16_t *mask, int16_t *psd,
|
||||
band = ff_ac3_bin_to_band_tab[start];
|
||||
do {
|
||||
int m = (FFMAX(mask[band] - snr_offset - floor, 0) & 0x1FE0) + floor;
|
||||
int band_end = FFMIN(ff_ac3_band_start_tab[band+1], end);
|
||||
band_end = ff_ac3_band_start_tab[++band];
|
||||
band_end = FFMIN(band_end, end);
|
||||
|
||||
for (; bin < band_end; bin++) {
|
||||
int address = av_clip((psd[bin] - m) >> 5, 0, 63);
|
||||
bap[bin] = bap_tab[address];
|
||||
}
|
||||
} while (end > ff_ac3_band_start_tab[band++]);
|
||||
} while (end > band_end);
|
||||
}
|
||||
|
||||
static void ac3_update_bap_counts_c(uint16_t mant_cnt[16], uint8_t *bap,
|
||||
|
||||
+9
-3
@@ -1360,11 +1360,17 @@ static int adpcm_decode_frame(AVCodecContext *avctx,
|
||||
}
|
||||
break;
|
||||
case CODEC_ID_ADPCM_EA:
|
||||
if (buf_size < 12 || AV_RL32(src) > (buf_size - 12)/30*28) {
|
||||
src += buf_size;
|
||||
break;
|
||||
/* Each EA ADPCM frame has a 12-byte header followed by 30-byte pieces,
|
||||
each coding 28 stereo samples. */
|
||||
if (buf_size < 12) {
|
||||
av_log(avctx, AV_LOG_ERROR, "frame too small\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
samples_in_chunk = AV_RL32(src);
|
||||
if (samples_in_chunk / 28 > (buf_size - 12) / 30) {
|
||||
av_log(avctx, AV_LOG_ERROR, "invalid frame\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
src += 4;
|
||||
current_left_sample = (int16_t)bytestream_get_le16(&src);
|
||||
previous_left_sample = (int16_t)bytestream_get_le16(&src);
|
||||
|
||||
+1
-1
@@ -1010,7 +1010,7 @@ static void zero_remaining(unsigned int b, unsigned int b_max,
|
||||
{
|
||||
unsigned int count = 0;
|
||||
|
||||
while (b < b_max)
|
||||
for (; b < b_max; b++)
|
||||
count += div_blocks[b];
|
||||
|
||||
if (count)
|
||||
|
||||
@@ -395,6 +395,8 @@ static int decodeTonalComponents (GetBitContext *gb, tonal_component *pComponent
|
||||
|
||||
for (k=0; k<coded_components; k++) {
|
||||
sfIndx = get_bits(gb,6);
|
||||
if (component_count >= 64)
|
||||
return AVERROR_INVALIDDATA;
|
||||
pComponent[component_count].pos = j * 64 + (get_bits(gb,6));
|
||||
max_coded_values = 1024 - pComponent[component_count].pos;
|
||||
coded_values = coded_values_per_component + 1;
|
||||
|
||||
+39
-1
@@ -30,6 +30,7 @@
|
||||
#include "libavutil/samplefmt.h"
|
||||
#include "libavutil/avutil.h"
|
||||
#include "libavutil/cpu.h"
|
||||
#include "libavutil/dict.h"
|
||||
|
||||
#include "libavcodec/version.h"
|
||||
|
||||
@@ -522,7 +523,7 @@ enum AVChromaLocation{
|
||||
/**
|
||||
* LPC analysis type
|
||||
*/
|
||||
attribute_deprecated enum AVLPCType {
|
||||
enum AVLPCType {
|
||||
AV_LPC_TYPE_DEFAULT = -1, ///< use the codec default LPC type
|
||||
AV_LPC_TYPE_NONE = 0, ///< do not use LPC prediction or use all zero coefficients
|
||||
AV_LPC_TYPE_FIXED = 1, ///< fixed LPC coefficients
|
||||
@@ -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.
|
||||
|
||||
+2
-2
@@ -457,8 +457,8 @@ static int read_dcs(AVCodecContext *avctx, GetBitContext *gb, Bundle *b,
|
||||
int start_bits, int has_sign)
|
||||
{
|
||||
int i, j, len, len2, bsize, sign, v, v2;
|
||||
int16_t *dst = (int16_t*)b->cur_dec;
|
||||
int16_t *dst_end =( int16_t*)b->data_end;
|
||||
int16_t *dst = (int16_t*)b->cur_dec;
|
||||
int16_t *dst_end = (int16_t*)b->data_end;
|
||||
|
||||
CHECK_READ_VAL(gb, b, len);
|
||||
v = get_bits(gb, start_bits - has_sign);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
+5
-1
@@ -1066,6 +1066,10 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
|
||||
q->sample_rate = avctx->sample_rate;
|
||||
q->nb_channels = avctx->channels;
|
||||
q->bit_rate = avctx->bit_rate;
|
||||
if (!q->nb_channels) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Invalid number of channels\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
/* Initialize RNG. */
|
||||
av_lfg_init(&q->random_state, 0);
|
||||
@@ -1079,7 +1083,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);
|
||||
|
||||
+2
-2
@@ -228,7 +228,7 @@ static av_cold int decode_init(AVCodecContext *avctx) {
|
||||
av_log(avctx, AV_LOG_ERROR,
|
||||
"CamStudio codec error: invalid depth %i bpp\n",
|
||||
avctx->bits_per_coded_sample);
|
||||
return 1;
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
c->bpp = avctx->bits_per_coded_sample;
|
||||
avcodec_get_frame_defaults(&c->pic);
|
||||
@@ -242,7 +242,7 @@ static av_cold int decode_init(AVCodecContext *avctx) {
|
||||
c->decomp_buf = av_malloc(c->decomp_size + AV_LZO_OUTPUT_PADDING);
|
||||
if (!c->decomp_buf) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Can't allocate decompression buffer.\n");
|
||||
return 1;
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include "libavutil/common.h"
|
||||
#include "libavutil/intmath.h"
|
||||
#include "libavutil/intreadwrite.h"
|
||||
#include "libavutil/mathematics.h"
|
||||
#include "libavutil/audioconvert.h"
|
||||
#include "avcodec.h"
|
||||
#include "dsputil.h"
|
||||
|
||||
+25
-15
@@ -146,11 +146,11 @@ static int cin_decode_huffman(const unsigned char *src, int src_size, unsigned c
|
||||
return dst_cur - dst;
|
||||
}
|
||||
|
||||
static void cin_decode_lzss(const unsigned char *src, int src_size, unsigned char *dst, int dst_size)
|
||||
static int cin_decode_lzss(const unsigned char *src, int src_size, unsigned char *dst, int dst_size)
|
||||
{
|
||||
uint16_t cmd;
|
||||
int i, sz, offset, code;
|
||||
unsigned char *dst_end = dst + dst_size;
|
||||
unsigned char *dst_end = dst + dst_size, *dst_start = dst;
|
||||
const unsigned char *src_end = src + src_size;
|
||||
|
||||
while (src < src_end && dst < dst_end) {
|
||||
@@ -161,6 +161,8 @@ static void cin_decode_lzss(const unsigned char *src, int src_size, unsigned cha
|
||||
} else {
|
||||
cmd = AV_RL16(src); src += 2;
|
||||
offset = cmd >> 4;
|
||||
if ((int) (dst - dst_start) < offset + 1)
|
||||
return AVERROR_INVALIDDATA;
|
||||
sz = (cmd & 0xF) + 2;
|
||||
/* don't use memcpy/memmove here as the decoding routine (ab)uses */
|
||||
/* buffer overlappings to repeat bytes in the destination */
|
||||
@@ -172,6 +174,8 @@ static void cin_decode_lzss(const unsigned char *src, int src_size, unsigned cha
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void cin_decode_rle(const unsigned char *src, int src_size, unsigned char *dst, int dst_size)
|
||||
@@ -201,13 +205,7 @@ static int cinvideo_decode_frame(AVCodecContext *avctx,
|
||||
const uint8_t *buf = avpkt->data;
|
||||
int buf_size = avpkt->size;
|
||||
CinVideoContext *cin = avctx->priv_data;
|
||||
int i, y, palette_type, palette_colors_count, bitmap_frame_type, bitmap_frame_size;
|
||||
|
||||
cin->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE;
|
||||
if (avctx->reget_buffer(avctx, &cin->frame)) {
|
||||
av_log(cin->avctx, AV_LOG_ERROR, "delphinecinvideo: reget_buffer() failed to allocate a frame\n");
|
||||
return -1;
|
||||
}
|
||||
int i, y, palette_type, palette_colors_count, bitmap_frame_type, bitmap_frame_size, res = 0;
|
||||
|
||||
palette_type = buf[0];
|
||||
palette_colors_count = AV_RL16(buf+1);
|
||||
@@ -233,8 +231,6 @@ static int cinvideo_decode_frame(AVCodecContext *avctx,
|
||||
bitmap_frame_size -= 4;
|
||||
}
|
||||
}
|
||||
memcpy(cin->frame.data[1], cin->palette, sizeof(cin->palette));
|
||||
cin->frame.palette_has_changed = 1;
|
||||
|
||||
/* note: the decoding routines below assumes that surface.width = surface.pitch */
|
||||
switch (bitmap_frame_type) {
|
||||
@@ -267,17 +263,31 @@ static int cinvideo_decode_frame(AVCodecContext *avctx,
|
||||
cin->bitmap_table[CIN_CUR_BMP], cin->bitmap_size);
|
||||
break;
|
||||
case 38:
|
||||
cin_decode_lzss(buf, bitmap_frame_size,
|
||||
cin->bitmap_table[CIN_CUR_BMP], cin->bitmap_size);
|
||||
res = cin_decode_lzss(buf, bitmap_frame_size,
|
||||
cin->bitmap_table[CIN_CUR_BMP],
|
||||
cin->bitmap_size);
|
||||
if (res < 0)
|
||||
return res;
|
||||
break;
|
||||
case 39:
|
||||
cin_decode_lzss(buf, bitmap_frame_size,
|
||||
cin->bitmap_table[CIN_CUR_BMP], cin->bitmap_size);
|
||||
res = cin_decode_lzss(buf, bitmap_frame_size,
|
||||
cin->bitmap_table[CIN_CUR_BMP],
|
||||
cin->bitmap_size);
|
||||
if (res < 0)
|
||||
return res;
|
||||
cin_apply_delta_data(cin->bitmap_table[CIN_PRE_BMP],
|
||||
cin->bitmap_table[CIN_CUR_BMP], cin->bitmap_size);
|
||||
break;
|
||||
}
|
||||
|
||||
cin->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE;
|
||||
if (avctx->reget_buffer(avctx, &cin->frame)) {
|
||||
av_log(cin->avctx, AV_LOG_ERROR, "delphinecinvideo: reget_buffer() failed to allocate a frame\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
memcpy(cin->frame.data[1], cin->palette, sizeof(cin->palette));
|
||||
cin->frame.palette_has_changed = 1;
|
||||
for (y = 0; y < cin->avctx->height; ++y)
|
||||
memcpy(cin->frame.data[0] + (cin->avctx->height - 1 - y) * cin->frame.linesize[0],
|
||||
cin->bitmap_table[CIN_CUR_BMP] + y * cin->avctx->width,
|
||||
|
||||
@@ -420,7 +420,16 @@ static inline int decode_subframe(FLACContext *s, int channel)
|
||||
type = get_bits(&s->gb, 6);
|
||||
|
||||
if (get_bits1(&s->gb)) {
|
||||
int left = get_bits_left(&s->gb);
|
||||
wasted = 1;
|
||||
if ( left < 0 ||
|
||||
(left < s->curr_bps && !show_bits_long(&s->gb, left)) ||
|
||||
!show_bits_long(&s->gb, s->curr_bps)) {
|
||||
av_log(s->avctx, AV_LOG_ERROR,
|
||||
"Invalid number of wasted bits > available bits (%d) - left=%d\n",
|
||||
s->curr_bps, left);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
while (!get_bits1(&s->gb))
|
||||
wasted++;
|
||||
s->curr_bps -= wasted;
|
||||
|
||||
+7
-7
@@ -135,7 +135,7 @@ static int decode_frame(AVCodecContext *avctx,
|
||||
uint32_t *luma1,*luma2,*cb,*cr;
|
||||
uint32_t offs[4];
|
||||
int i, j, is_chroma, planes;
|
||||
|
||||
enum PixelFormat pix_fmt;
|
||||
|
||||
header = AV_RL32(buf);
|
||||
version = header & 0xff;
|
||||
@@ -152,12 +152,16 @@ static int decode_frame(AVCodecContext *avctx,
|
||||
if (header_size == 8)
|
||||
buf+=4;
|
||||
|
||||
pix_fmt = version & 1 ? PIX_FMT_BGR24 : PIX_FMT_YUVJ420P;
|
||||
if (avctx->pix_fmt != pix_fmt && f->data[0]) {
|
||||
avctx->release_buffer(avctx, f);
|
||||
}
|
||||
avctx->pix_fmt = pix_fmt;
|
||||
|
||||
switch(version) {
|
||||
case 0:
|
||||
default:
|
||||
/* Fraps v0 is a reordered YUV420 */
|
||||
avctx->pix_fmt = PIX_FMT_YUVJ420P;
|
||||
|
||||
if ( (buf_size != avctx->width*avctx->height*3/2+header_size) &&
|
||||
(buf_size != header_size) ) {
|
||||
av_log(avctx, AV_LOG_ERROR,
|
||||
@@ -205,8 +209,6 @@ static int decode_frame(AVCodecContext *avctx,
|
||||
|
||||
case 1:
|
||||
/* Fraps v1 is an upside-down BGR24 */
|
||||
avctx->pix_fmt = PIX_FMT_BGR24;
|
||||
|
||||
if ( (buf_size != avctx->width*avctx->height*3+header_size) &&
|
||||
(buf_size != header_size) ) {
|
||||
av_log(avctx, AV_LOG_ERROR,
|
||||
@@ -241,7 +243,6 @@ static int decode_frame(AVCodecContext *avctx,
|
||||
* Fraps v2 is Huffman-coded YUV420 planes
|
||||
* Fraps v4 is virtually the same
|
||||
*/
|
||||
avctx->pix_fmt = PIX_FMT_YUVJ420P;
|
||||
planes = 3;
|
||||
f->reference = 1;
|
||||
f->buffer_hints = FF_BUFFER_HINTS_VALID |
|
||||
@@ -286,7 +287,6 @@ static int decode_frame(AVCodecContext *avctx,
|
||||
case 3:
|
||||
case 5:
|
||||
/* Virtually the same as version 4, but is for RGB24 */
|
||||
avctx->pix_fmt = PIX_FMT_BGR24;
|
||||
planes = 3;
|
||||
f->reference = 1;
|
||||
f->buffer_hints = FF_BUFFER_HINTS_VALID |
|
||||
|
||||
+3
-3
@@ -123,7 +123,7 @@ static inline int svq3_get_ue_golomb(GetBitContext *gb){
|
||||
}else{
|
||||
int ret = 1;
|
||||
|
||||
while (1) {
|
||||
do {
|
||||
buf >>= 32 - 8;
|
||||
LAST_SKIP_BITS(re, gb, FFMIN(ff_interleaved_golomb_vlc_len[buf], 8));
|
||||
|
||||
@@ -135,7 +135,7 @@ static inline int svq3_get_ue_golomb(GetBitContext *gb){
|
||||
ret = (ret << 4) | ff_interleaved_dirac_golomb_vlc_code[buf];
|
||||
UPDATE_CACHE(re, gb);
|
||||
buf = GET_CACHE(re, gb);
|
||||
}
|
||||
} while (ret);
|
||||
|
||||
CLOSE_READER(re, gb);
|
||||
return ret - 1;
|
||||
@@ -301,7 +301,7 @@ static inline int get_ur_golomb_jpegls(GetBitContext *gb, int k, int limit, int
|
||||
return buf;
|
||||
}else{
|
||||
int i;
|
||||
for(i=0; SHOW_UBITS(re, gb, 1) == 0; i++){
|
||||
for (i = 0; i < limit && SHOW_UBITS(re, gb, 1) == 0; i++) {
|
||||
LAST_SKIP_BITS(re, gb, 1);
|
||||
UPDATE_CACHE(re, gb);
|
||||
}
|
||||
|
||||
@@ -564,8 +564,7 @@ retry:
|
||||
#if HAVE_MMX
|
||||
if (s->codec_id == CODEC_ID_MPEG4 && s->xvid_build>=0 && avctx->idct_algo == FF_IDCT_AUTO && (av_get_cpu_flags() & AV_CPU_FLAG_MMX)) {
|
||||
avctx->idct_algo= FF_IDCT_XVIDMMX;
|
||||
avctx->coded_width= 0; // force reinit
|
||||
// dsputil_init(&s->dsp, avctx);
|
||||
ff_dct_common_init(s);
|
||||
s->picture_number=0;
|
||||
}
|
||||
#endif
|
||||
@@ -579,6 +578,12 @@ retry:
|
||||
|| s->height != avctx->coded_height) {
|
||||
/* H.263 could change picture size any time */
|
||||
ParseContext pc= s->parse_context; //FIXME move these demuxng hack to avformat
|
||||
|
||||
if (HAVE_THREADS && (s->avctx->active_thread_type&FF_THREAD_FRAME)) {
|
||||
av_log_missing_feature(s->avctx, "Width/height/bit depth/chroma idc changing with threads is", 0);
|
||||
return -1; // width / height changed during parallelized decoding
|
||||
}
|
||||
|
||||
s->parse_context.buffer=0;
|
||||
MPV_common_end(s);
|
||||
s->parse_context= pc;
|
||||
|
||||
+19
-29
@@ -108,7 +108,10 @@ int ff_h264_check_intra4x4_pred_mode(H264Context *h){
|
||||
return 0;
|
||||
} //FIXME cleanup like check_intra_pred_mode
|
||||
|
||||
static int check_intra_pred_mode(H264Context *h, int mode, int is_chroma){
|
||||
/**
|
||||
* checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks.
|
||||
*/
|
||||
int ff_h264_check_intra_pred_mode(H264Context *h, int mode, int is_chroma){
|
||||
MpegEncContext * const s = &h->s;
|
||||
static const int8_t top [7]= {LEFT_DC_PRED8x8, 1,-1,-1};
|
||||
static const int8_t left[7]= { TOP_DC_PRED8x8,-1, 2,-1,DC_128_PRED8x8};
|
||||
@@ -140,23 +143,6 @@ static int check_intra_pred_mode(H264Context *h, int mode, int is_chroma){
|
||||
return mode;
|
||||
}
|
||||
|
||||
/**
|
||||
* checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks.
|
||||
*/
|
||||
int ff_h264_check_intra16x16_pred_mode(H264Context *h, int mode)
|
||||
{
|
||||
return check_intra_pred_mode(h, mode, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks.
|
||||
*/
|
||||
int ff_h264_check_intra_chroma_pred_mode(H264Context *h, int mode)
|
||||
{
|
||||
return check_intra_pred_mode(h, mode, 1);
|
||||
}
|
||||
|
||||
|
||||
const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src, int *dst_length, int *consumed, int length){
|
||||
int i, si, di;
|
||||
uint8_t *dst;
|
||||
@@ -2231,7 +2217,11 @@ static void implicit_weight_table(H264Context *h, int field){
|
||||
}
|
||||
|
||||
if(field < 0){
|
||||
cur_poc = s->current_picture_ptr->poc;
|
||||
if (s->picture_structure == PICT_FRAME) {
|
||||
cur_poc = s->current_picture_ptr->poc;
|
||||
} else {
|
||||
cur_poc = s->current_picture_ptr->field_poc[s->picture_structure - 1];
|
||||
}
|
||||
if( h->ref_count[0] == 1 && h->ref_count[1] == 1 && !FRAME_MBAFF
|
||||
&& h->ref_list[0][0].poc + h->ref_list[1][0].poc == 2*cur_poc){
|
||||
h->use_weight= 0;
|
||||
@@ -2810,11 +2800,9 @@ static int decode_slice_header(H264Context *h, H264Context *h0){
|
||||
s0->first_field = FIELD_PICTURE;
|
||||
|
||||
} else {
|
||||
if (h->nal_ref_idc &&
|
||||
s0->current_picture_ptr->reference &&
|
||||
s0->current_picture_ptr->frame_num != h->frame_num) {
|
||||
if (s0->current_picture_ptr->frame_num != h->frame_num) {
|
||||
/*
|
||||
* This and previous field were reference, but had
|
||||
* This and previous field had
|
||||
* different frame_nums. Consider this field first in
|
||||
* pair. Throw away previous field except for reference
|
||||
* purposes.
|
||||
@@ -2898,7 +2886,8 @@ static int decode_slice_header(H264Context *h, H264Context *h0){
|
||||
h->ref_count[1]= h->pps.ref_count[1];
|
||||
|
||||
if(h->slice_type_nos != AV_PICTURE_TYPE_I){
|
||||
unsigned max= (16<<(s->picture_structure != PICT_FRAME))-1;
|
||||
unsigned max= s->picture_structure == PICT_FRAME ? 15 : 31;
|
||||
|
||||
if(h->slice_type_nos == AV_PICTURE_TYPE_B){
|
||||
h->direct_spatial_mv_pred= get_bits1(&s->gb);
|
||||
}
|
||||
@@ -2908,13 +2897,14 @@ static int decode_slice_header(H264Context *h, H264Context *h0){
|
||||
h->ref_count[0]= get_ue_golomb(&s->gb) + 1;
|
||||
if(h->slice_type_nos==AV_PICTURE_TYPE_B)
|
||||
h->ref_count[1]= get_ue_golomb(&s->gb) + 1;
|
||||
}
|
||||
|
||||
}
|
||||
if(h->ref_count[0]-1 > max || h->ref_count[1]-1 > max){
|
||||
if (h->ref_count[0]-1 > max || h->ref_count[1]-1 > max){
|
||||
av_log(h->s.avctx, AV_LOG_ERROR, "reference overflow\n");
|
||||
h->ref_count[0]= h->ref_count[1]= 1;
|
||||
return -1;
|
||||
h->ref_count[0] = h->ref_count[1] = 1;
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
if(h->slice_type_nos == AV_PICTURE_TYPE_B)
|
||||
h->list_count= 2;
|
||||
else
|
||||
@@ -3763,7 +3753,7 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){
|
||||
case NAL_IDR_SLICE:
|
||||
case NAL_SLICE:
|
||||
init_get_bits(&hx->s.gb, ptr, bit_length);
|
||||
if(!get_ue_golomb(&hx->s.gb))
|
||||
if (!get_ue_golomb(&hx->s.gb))
|
||||
nals_needed = nal_index;
|
||||
}
|
||||
continue;
|
||||
|
||||
+2
-7
@@ -658,12 +658,7 @@ int ff_h264_check_intra4x4_pred_mode(H264Context *h);
|
||||
/**
|
||||
* Check if the top & left blocks are available if needed & change the dc mode so it only uses the available blocks.
|
||||
*/
|
||||
int ff_h264_check_intra16x16_pred_mode(H264Context *h, int mode);
|
||||
|
||||
/**
|
||||
* Check if the top & left blocks are available if needed & change the dc mode so it only uses the available blocks.
|
||||
*/
|
||||
int ff_h264_check_intra_chroma_pred_mode(H264Context *h, int mode);
|
||||
int ff_h264_check_intra_pred_mode(H264Context *h, int mode, int is_chroma);
|
||||
|
||||
void ff_h264_write_back_intra_pred_mode(H264Context *h);
|
||||
void ff_h264_hl_decode_mb(H264Context *h);
|
||||
@@ -1075,7 +1070,7 @@ static void fill_decode_caches(H264Context *h, int mb_type){
|
||||
AV_ZERO32(h->mv_cache [list][scan8[0] + 4 - 1*8]);
|
||||
h->ref_cache[list][scan8[0] + 4 - 1*8]= topright_type ? LIST_NOT_USED : PART_NOT_AVAILABLE;
|
||||
}
|
||||
if(h->ref_cache[list][scan8[0] + 4 - 1*8] < 0){
|
||||
if(h->ref_cache[list][scan8[0] + 2 - 1*8] < 0 || h->ref_cache[list][scan8[0] + 4 - 1*8] < 0){
|
||||
if(USES_LIST(topleft_type, list)){
|
||||
const int b_xy = h->mb2b_xy [topleft_xy] + 3 + h->b_stride + (h->topleft_partition & 2*h->b_stride);
|
||||
const int b8_xy= 4*topleft_xy + 1 + (h->topleft_partition & 2);
|
||||
|
||||
@@ -1959,6 +1959,8 @@ decode_intra_mb:
|
||||
}
|
||||
|
||||
// The pixels are stored in the same order as levels in h->mb array.
|
||||
if ((int) (h->cabac.bytestream_end - ptr) < mb_size)
|
||||
return -1;
|
||||
memcpy(h->mb, ptr, mb_size); ptr+=mb_size;
|
||||
|
||||
ff_init_cabac_decoder(&h->cabac, ptr, h->cabac.bytestream_end - ptr);
|
||||
@@ -2003,14 +2005,14 @@ decode_intra_mb:
|
||||
ff_h264_write_back_intra_pred_mode(h);
|
||||
if( ff_h264_check_intra4x4_pred_mode(h) < 0 ) return -1;
|
||||
} else {
|
||||
h->intra16x16_pred_mode= ff_h264_check_intra16x16_pred_mode( h, h->intra16x16_pred_mode );
|
||||
h->intra16x16_pred_mode= ff_h264_check_intra_pred_mode( h, h->intra16x16_pred_mode, 0 );
|
||||
if( h->intra16x16_pred_mode < 0 ) return -1;
|
||||
}
|
||||
if(decode_chroma){
|
||||
h->chroma_pred_mode_table[mb_xy] =
|
||||
pred_mode = decode_cabac_mb_chroma_pre_mode( h );
|
||||
|
||||
pred_mode= ff_h264_check_intra_chroma_pred_mode( h, pred_mode );
|
||||
pred_mode= ff_h264_check_intra_pred_mode( h, pred_mode, 1 );
|
||||
if( pred_mode < 0 ) return -1;
|
||||
h->chroma_pred_mode= pred_mode;
|
||||
} else {
|
||||
|
||||
@@ -238,17 +238,18 @@ static inline int pred_non_zero_count(H264Context *h, int n){
|
||||
}
|
||||
|
||||
static av_cold void init_cavlc_level_tab(void){
|
||||
int suffix_length, mask;
|
||||
int suffix_length;
|
||||
unsigned int i;
|
||||
|
||||
for(suffix_length=0; suffix_length<7; suffix_length++){
|
||||
for(i=0; i<(1<<LEVEL_TAB_BITS); i++){
|
||||
int prefix= LEVEL_TAB_BITS - av_log2(2*i);
|
||||
int level_code= (prefix<<suffix_length) + (i>>(LEVEL_TAB_BITS-prefix-1-suffix_length)) - (1<<suffix_length);
|
||||
|
||||
mask= -(level_code&1);
|
||||
level_code= (((2+level_code)>>1) ^ mask) - mask;
|
||||
if(prefix + 1 + suffix_length <= LEVEL_TAB_BITS){
|
||||
int level_code = (prefix << suffix_length) +
|
||||
(i >> (av_log2(i) - suffix_length)) - (1 << suffix_length);
|
||||
int mask = -(level_code&1);
|
||||
level_code = (((2 + level_code) >> 1) ^ mask) - mask;
|
||||
cavlc_level_tab[suffix_length][i][0]= level_code;
|
||||
cavlc_level_tab[suffix_length][i][1]= prefix + 1 + suffix_length;
|
||||
}else if(prefix + 1 <= LEVEL_TAB_BITS){
|
||||
@@ -735,12 +736,12 @@ decode_intra_mb:
|
||||
if( ff_h264_check_intra4x4_pred_mode(h) < 0)
|
||||
return -1;
|
||||
}else{
|
||||
h->intra16x16_pred_mode= ff_h264_check_intra16x16_pred_mode(h, h->intra16x16_pred_mode);
|
||||
h->intra16x16_pred_mode= ff_h264_check_intra_pred_mode(h, h->intra16x16_pred_mode, 0);
|
||||
if(h->intra16x16_pred_mode < 0)
|
||||
return -1;
|
||||
}
|
||||
if(decode_chroma){
|
||||
pred_mode= ff_h264_check_intra_chroma_pred_mode(h, get_ue_golomb_31(&s->gb));
|
||||
pred_mode= ff_h264_check_intra_pred_mode(h, get_ue_golomb_31(&s->gb), 1);
|
||||
if(pred_mode < 0)
|
||||
return -1;
|
||||
h->chroma_pred_mode= pred_mode;
|
||||
|
||||
@@ -253,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)
|
||||
|
||||
@@ -251,6 +251,12 @@ static int h264_parse(AVCodecParserContext *s,
|
||||
h->got_first = 1;
|
||||
if (avctx->extradata_size) {
|
||||
h->s.avctx = avctx;
|
||||
// must be done like in decoder, otherwise opening the parser,
|
||||
// letting it create extradata and then closing and opening again
|
||||
// will cause has_b_frames to be always set.
|
||||
// Note that estimate_timings_from_pts does exactly this.
|
||||
if (!avctx->has_b_frames)
|
||||
h->s.low_delay = 1;
|
||||
ff_h264_decode_extradata(h, avctx->extradata, avctx->extradata_size);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -342,6 +342,10 @@ int ff_h264_decode_seq_parameter_set(H264Context *h){
|
||||
|
||||
if(sps->profile_idc >= 100){ //high profile
|
||||
sps->chroma_format_idc= get_ue_golomb_31(&s->gb);
|
||||
if (sps->chroma_format_idc > 3U) {
|
||||
av_log(h->s.avctx, AV_LOG_ERROR, "chroma_format_idc %d is illegal\n", sps->chroma_format_idc);
|
||||
goto fail;
|
||||
}
|
||||
if(sps->chroma_format_idc == 3)
|
||||
sps->residual_color_transform_flag = get_bits1(&s->gb);
|
||||
sps->bit_depth_luma = get_ue_golomb(&s->gb) + 8;
|
||||
@@ -481,6 +485,7 @@ int ff_h264_decode_picture_parameter_set(H264Context *h, int bit_length){
|
||||
unsigned int pps_id= get_ue_golomb(&s->gb);
|
||||
PPS *pps;
|
||||
const int qp_bd_offset = 6*(h->sps.bit_depth_luma-8);
|
||||
int bits_left;
|
||||
|
||||
if(pps_id >= MAX_PPS_COUNT) {
|
||||
av_log(h->s.avctx, AV_LOG_ERROR, "pps_id (%d) out of range\n", pps_id);
|
||||
@@ -557,7 +562,9 @@ int ff_h264_decode_picture_parameter_set(H264Context *h, int bit_length){
|
||||
memcpy(pps->scaling_matrix4, h->sps_buffers[pps->sps_id]->scaling_matrix4, sizeof(pps->scaling_matrix4));
|
||||
memcpy(pps->scaling_matrix8, h->sps_buffers[pps->sps_id]->scaling_matrix8, sizeof(pps->scaling_matrix8));
|
||||
|
||||
if(get_bits_count(&s->gb) < bit_length){
|
||||
bits_left = bit_length - get_bits_count(&s->gb);
|
||||
if (bits_left && (bits_left > 8 ||
|
||||
show_bits(&s->gb, bits_left) != 1 << (bits_left - 1))) {
|
||||
pps->transform_8x8_mode= get_bits1(&s->gb);
|
||||
decode_scaling_matrices(h, h->sps_buffers[pps->sps_id], pps, 0, pps->scaling_matrix4, pps->scaling_matrix8);
|
||||
pps->chroma_qp_index_offset[1]= get_se_golomb(&s->gb); //second_chroma_qp_index_offset
|
||||
|
||||
@@ -82,13 +82,15 @@ typedef struct HYuvContext{
|
||||
DSPContext dsp;
|
||||
}HYuvContext;
|
||||
|
||||
static const unsigned char classic_shift_luma[] = {
|
||||
#define classic_shift_luma_table_size 42
|
||||
static const unsigned char classic_shift_luma[classic_shift_luma_table_size + FF_INPUT_BUFFER_PADDING_SIZE] = {
|
||||
34,36,35,69,135,232,9,16,10,24,11,23,12,16,13,10,14,8,15,8,
|
||||
16,8,17,20,16,10,207,206,205,236,11,8,10,21,9,23,8,8,199,70,
|
||||
69,68, 0
|
||||
};
|
||||
|
||||
static const unsigned char classic_shift_chroma[] = {
|
||||
#define classic_shift_chroma_table_size 59
|
||||
static const unsigned char classic_shift_chroma[classic_shift_chroma_table_size + FF_INPUT_BUFFER_PADDING_SIZE] = {
|
||||
66,36,37,38,39,40,41,75,76,77,110,239,144,81,82,83,84,85,118,183,
|
||||
56,57,88,89,56,89,154,57,58,57,26,141,57,56,58,57,58,57,184,119,
|
||||
214,245,116,83,82,49,80,79,78,77,44,75,41,40,39,38,37,36,34, 0
|
||||
@@ -184,7 +186,7 @@ static int read_len_table(uint8_t *dst, GetBitContext *gb){
|
||||
if(repeat==0)
|
||||
repeat= get_bits(gb, 8);
|
||||
//printf("%d %d\n", val, repeat);
|
||||
if(i+repeat > 256) {
|
||||
if(i+repeat > 256 || get_bits_left(gb) < 0) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Error reading huffman table\n");
|
||||
return -1;
|
||||
}
|
||||
@@ -366,10 +368,10 @@ static int read_old_huffman_tables(HYuvContext *s){
|
||||
GetBitContext gb;
|
||||
int i;
|
||||
|
||||
init_get_bits(&gb, classic_shift_luma, sizeof(classic_shift_luma)*8);
|
||||
init_get_bits(&gb, classic_shift_luma, classic_shift_luma_table_size*8);
|
||||
if(read_len_table(s->len[0], &gb)<0)
|
||||
return -1;
|
||||
init_get_bits(&gb, classic_shift_chroma, sizeof(classic_shift_chroma)*8);
|
||||
init_get_bits(&gb, classic_shift_chroma, classic_shift_chroma_table_size*8);
|
||||
if(read_len_table(s->len[1], &gb)<0)
|
||||
return -1;
|
||||
|
||||
@@ -515,7 +517,7 @@ s->bgr32=1;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
alloc_temp(s);
|
||||
|
||||
@@ -321,7 +321,7 @@ int ff_j2k_dwt_init(DWTContext *s, uint16_t border[2][2], int decomp_levels, int
|
||||
int i, j, lev = decomp_levels, maxlen,
|
||||
b[2][2];
|
||||
|
||||
if (decomp_levels >= FF_DWT_MAX_DECLVLS)
|
||||
if ((unsigned)decomp_levels >= FF_DWT_MAX_DECLVLS)
|
||||
return AVERROR_INVALIDDATA;
|
||||
s->ndeclevels = decomp_levels;
|
||||
s->type = type;
|
||||
|
||||
+6
-2
@@ -359,7 +359,7 @@ static int get_qcx(J2kDecoderContext *s, int n, J2kQuantStyle *q)
|
||||
|
||||
if (q->quantsty == J2K_QSTY_NONE){
|
||||
n -= 3;
|
||||
if (s->buf_end - s->buf < n)
|
||||
if (s->buf_end - s->buf < n || 32*3 < n)
|
||||
return AVERROR(EINVAL);
|
||||
for (i = 0; i < n; i++)
|
||||
q->expn[i] = bytestream_get_byte(&s->buf) >> 3;
|
||||
@@ -376,7 +376,7 @@ static int get_qcx(J2kDecoderContext *s, int n, J2kQuantStyle *q)
|
||||
}
|
||||
} else{
|
||||
n = (n - 3) >> 1;
|
||||
if (s->buf_end - s->buf < n)
|
||||
if (s->buf_end - s->buf < n || 32*3 < n)
|
||||
return AVERROR(EINVAL);
|
||||
for (i = 0; i < n; i++){
|
||||
x = bytestream_get_be16(&s->buf);
|
||||
@@ -421,6 +421,10 @@ static uint8_t get_sot(J2kDecoderContext *s)
|
||||
return AVERROR(EINVAL);
|
||||
|
||||
s->curtileno = bytestream_get_be16(&s->buf); ///< Isot
|
||||
if((unsigned)s->curtileno >= s->numXtiles * s->numYtiles){
|
||||
s->curtileno=0;
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
s->buf += 4; ///< Psot (ignored)
|
||||
|
||||
|
||||
+1
-1
@@ -150,7 +150,7 @@ static int decode_frame(AVCodecContext *avctx,
|
||||
|
||||
if (video_type == 0 || video_type == 1) {
|
||||
GetBitContext gb;
|
||||
init_get_bits(&gb, buf, FFMIN(video_size, (buf_end - buf) * 8));
|
||||
init_get_bits(&gb, buf, 8 * FFMIN(video_size, buf_end - buf));
|
||||
|
||||
for (j = 0; j < avctx->height; j += 8)
|
||||
for (i = 0; i < avctx->width; i += 8)
|
||||
|
||||
+52
-37
@@ -30,19 +30,26 @@
|
||||
|
||||
typedef struct {
|
||||
AVCodecContext *avctx;
|
||||
AVFrame pic;
|
||||
uint16_t *prev, *cur;
|
||||
AVFrame prev, cur;
|
||||
} KgvContext;
|
||||
|
||||
static void decode_flush(AVCodecContext *avctx)
|
||||
{
|
||||
KgvContext * const c = avctx->priv_data;
|
||||
|
||||
if (c->prev.data[0])
|
||||
avctx->release_buffer(avctx, &c->prev);
|
||||
}
|
||||
|
||||
static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt)
|
||||
{
|
||||
const uint8_t *buf = avpkt->data;
|
||||
const uint8_t *buf_end = buf + avpkt->size;
|
||||
KgvContext * const c = avctx->priv_data;
|
||||
int offsets[7];
|
||||
int offsets[8];
|
||||
uint16_t *out, *prev;
|
||||
int outcnt = 0, maxcnt;
|
||||
int w, h, i;
|
||||
int w, h, i, res;
|
||||
|
||||
if (avpkt->size < 2)
|
||||
return -1;
|
||||
@@ -54,22 +61,25 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac
|
||||
if (av_image_check_size(w, h, 0, avctx))
|
||||
return -1;
|
||||
|
||||
if (w != avctx->width || h != avctx->height)
|
||||
if (w != avctx->width || h != avctx->height) {
|
||||
if (c->prev.data[0])
|
||||
avctx->release_buffer(avctx, &c->prev);
|
||||
avcodec_set_dimensions(avctx, w, h);
|
||||
}
|
||||
|
||||
maxcnt = w * h;
|
||||
|
||||
out = av_realloc(c->cur, w * h * 2);
|
||||
if (!out)
|
||||
return -1;
|
||||
c->cur = out;
|
||||
c->cur.reference = 3;
|
||||
if ((res = avctx->get_buffer(avctx, &c->cur)) < 0)
|
||||
return res;
|
||||
out = (uint16_t *) c->cur.data[0];
|
||||
if (c->prev.data[0]) {
|
||||
prev = (uint16_t *) c->prev.data[0];
|
||||
} else {
|
||||
prev = NULL;
|
||||
}
|
||||
|
||||
prev = av_realloc(c->prev, w * h * 2);
|
||||
if (!prev)
|
||||
return -1;
|
||||
c->prev = prev;
|
||||
|
||||
for (i = 0; i < 7; i++)
|
||||
for (i = 0; i < 8; i++)
|
||||
offsets[i] = -1;
|
||||
|
||||
while (outcnt < maxcnt && buf_end - 2 > buf) {
|
||||
@@ -80,6 +90,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac
|
||||
out[outcnt++] = code; // rgb555 pixel coded directly
|
||||
} else {
|
||||
int count;
|
||||
int inp_off;
|
||||
uint16_t *inp;
|
||||
|
||||
if ((code & 0x6000) == 0x6000) {
|
||||
@@ -101,7 +112,14 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac
|
||||
if (maxcnt - start < count)
|
||||
break;
|
||||
|
||||
inp = prev + start;
|
||||
if (!prev) {
|
||||
av_log(avctx, AV_LOG_ERROR,
|
||||
"Frame reference does not exist\n");
|
||||
break;
|
||||
}
|
||||
|
||||
inp = prev;
|
||||
inp_off = start;
|
||||
} else {
|
||||
// copy from earlier in this frame
|
||||
int offset = (code & 0x1FFF) + 1;
|
||||
@@ -119,27 +137,28 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac
|
||||
if (outcnt < offset)
|
||||
break;
|
||||
|
||||
inp = out + outcnt - offset;
|
||||
inp = out;
|
||||
inp_off = outcnt - offset;
|
||||
}
|
||||
|
||||
if (maxcnt - outcnt < count)
|
||||
break;
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
for (i = inp_off; i < count + inp_off; i++) {
|
||||
out[outcnt++] = inp[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (outcnt - maxcnt)
|
||||
av_log(avctx, AV_LOG_DEBUG, "frame finished with %d diff\n", outcnt - maxcnt);
|
||||
|
||||
c->pic.data[0] = (uint8_t *)c->cur;
|
||||
c->pic.linesize[0] = w * 2;
|
||||
|
||||
*data_size = sizeof(AVFrame);
|
||||
*(AVFrame*)data = c->pic;
|
||||
*(AVFrame*)data = c->cur;
|
||||
|
||||
FFSWAP(uint16_t *, c->cur, c->prev);
|
||||
if (c->prev.data[0])
|
||||
avctx->release_buffer(avctx, &c->prev);
|
||||
FFSWAP(AVFrame, c->cur, c->prev);
|
||||
|
||||
return avpkt->size;
|
||||
}
|
||||
@@ -150,29 +169,25 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
||||
|
||||
c->avctx = avctx;
|
||||
avctx->pix_fmt = PIX_FMT_RGB555;
|
||||
avcodec_get_frame_defaults(&c->pic);
|
||||
avctx->flags |= CODEC_FLAG_EMU_EDGE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static av_cold int decode_end(AVCodecContext *avctx)
|
||||
{
|
||||
KgvContext * const c = avctx->priv_data;
|
||||
|
||||
av_freep(&c->cur);
|
||||
av_freep(&c->prev);
|
||||
|
||||
decode_flush(avctx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
AVCodec ff_kgv1_decoder = {
|
||||
"kgv1",
|
||||
AVMEDIA_TYPE_VIDEO,
|
||||
CODEC_ID_KGV1,
|
||||
sizeof(KgvContext),
|
||||
decode_init,
|
||||
NULL,
|
||||
decode_end,
|
||||
decode_frame,
|
||||
.name = "kgv1",
|
||||
.type = AVMEDIA_TYPE_VIDEO,
|
||||
.id = CODEC_ID_KGV1,
|
||||
.priv_data_size = sizeof(KgvContext),
|
||||
.init = decode_init,
|
||||
.close = decode_end,
|
||||
.decode = decode_frame,
|
||||
.flush = decode_flush,
|
||||
.long_name = NULL_IF_CONFIG_SMALL("Kega Game Video"),
|
||||
};
|
||||
|
||||
+66
-16
@@ -57,17 +57,21 @@ typedef struct BitBuf {
|
||||
|
||||
#define kmvc_init_getbits(bb, src) bb.bits = 7; bb.bitbuf = *src++;
|
||||
|
||||
#define kmvc_getbit(bb, src, res) {\
|
||||
#define kmvc_getbit(bb, src, src_end, res) {\
|
||||
res = 0; \
|
||||
if (bb.bitbuf & (1 << bb.bits)) res = 1; \
|
||||
bb.bits--; \
|
||||
if(bb.bits == -1) { \
|
||||
if (src >= src_end) { \
|
||||
av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n"); \
|
||||
return AVERROR_INVALIDDATA; \
|
||||
} \
|
||||
bb.bitbuf = *src++; \
|
||||
bb.bits = 7; \
|
||||
} \
|
||||
}
|
||||
|
||||
static void kmvc_decode_intra_8x8(KmvcContext * ctx, const uint8_t * src, int w, int h)
|
||||
static int kmvc_decode_intra_8x8(KmvcContext * ctx, const uint8_t * src, int src_size, int w, int h)
|
||||
{
|
||||
BitBuf bb;
|
||||
int res, val;
|
||||
@@ -75,13 +79,18 @@ static void kmvc_decode_intra_8x8(KmvcContext * ctx, const uint8_t * src, int w,
|
||||
int bx, by;
|
||||
int l0x, l1x, l0y, l1y;
|
||||
int mx, my;
|
||||
const uint8_t *src_end = src + src_size;
|
||||
|
||||
kmvc_init_getbits(bb, src);
|
||||
|
||||
for (by = 0; by < h; by += 8)
|
||||
for (bx = 0; bx < w; bx += 8) {
|
||||
kmvc_getbit(bb, src, res);
|
||||
kmvc_getbit(bb, src, src_end, res);
|
||||
if (!res) { // fill whole 8x8 block
|
||||
if (src >= src_end) {
|
||||
av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
val = *src++;
|
||||
for (i = 0; i < 64; i++)
|
||||
BLK(ctx->cur, bx + (i & 0x7), by + (i >> 3)) = val;
|
||||
@@ -89,14 +98,22 @@ static void kmvc_decode_intra_8x8(KmvcContext * ctx, const uint8_t * src, int w,
|
||||
for (i = 0; i < 4; i++) {
|
||||
l0x = bx + (i & 1) * 4;
|
||||
l0y = by + (i & 2) * 2;
|
||||
kmvc_getbit(bb, src, res);
|
||||
kmvc_getbit(bb, src, src_end, res);
|
||||
if (!res) {
|
||||
kmvc_getbit(bb, src, res);
|
||||
kmvc_getbit(bb, src, src_end, res);
|
||||
if (!res) { // fill whole 4x4 block
|
||||
if (src >= src_end) {
|
||||
av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
val = *src++;
|
||||
for (j = 0; j < 16; j++)
|
||||
BLK(ctx->cur, l0x + (j & 3), l0y + (j >> 2)) = val;
|
||||
} else { // copy block from already decoded place
|
||||
if (src >= src_end) {
|
||||
av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
val = *src++;
|
||||
mx = val & 0xF;
|
||||
my = val >> 4;
|
||||
@@ -108,16 +125,24 @@ static void kmvc_decode_intra_8x8(KmvcContext * ctx, const uint8_t * src, int w,
|
||||
for (j = 0; j < 4; j++) {
|
||||
l1x = l0x + (j & 1) * 2;
|
||||
l1y = l0y + (j & 2);
|
||||
kmvc_getbit(bb, src, res);
|
||||
kmvc_getbit(bb, src, src_end, res);
|
||||
if (!res) {
|
||||
kmvc_getbit(bb, src, res);
|
||||
kmvc_getbit(bb, src, src_end, res);
|
||||
if (!res) { // fill whole 2x2 block
|
||||
if (src >= src_end) {
|
||||
av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
val = *src++;
|
||||
BLK(ctx->cur, l1x, l1y) = val;
|
||||
BLK(ctx->cur, l1x + 1, l1y) = val;
|
||||
BLK(ctx->cur, l1x, l1y + 1) = val;
|
||||
BLK(ctx->cur, l1x + 1, l1y + 1) = val;
|
||||
} else { // copy block from already decoded place
|
||||
if (src >= src_end) {
|
||||
av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
val = *src++;
|
||||
mx = val & 0xF;
|
||||
my = val >> 4;
|
||||
@@ -140,9 +165,11 @@ static void kmvc_decode_intra_8x8(KmvcContext * ctx, const uint8_t * src, int w,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void kmvc_decode_inter_8x8(KmvcContext * ctx, const uint8_t * src, int w, int h)
|
||||
static int kmvc_decode_inter_8x8(KmvcContext * ctx, const uint8_t * src, int src_size, int w, int h)
|
||||
{
|
||||
BitBuf bb;
|
||||
int res, val;
|
||||
@@ -150,15 +177,20 @@ static void kmvc_decode_inter_8x8(KmvcContext * ctx, const uint8_t * src, int w,
|
||||
int bx, by;
|
||||
int l0x, l1x, l0y, l1y;
|
||||
int mx, my;
|
||||
const uint8_t *src_end = src + src_size;
|
||||
|
||||
kmvc_init_getbits(bb, src);
|
||||
|
||||
for (by = 0; by < h; by += 8)
|
||||
for (bx = 0; bx < w; bx += 8) {
|
||||
kmvc_getbit(bb, src, res);
|
||||
kmvc_getbit(bb, src, src_end, res);
|
||||
if (!res) {
|
||||
kmvc_getbit(bb, src, res);
|
||||
kmvc_getbit(bb, src, src_end, res);
|
||||
if (!res) { // fill whole 8x8 block
|
||||
if (src >= src_end) {
|
||||
av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
val = *src++;
|
||||
for (i = 0; i < 64; i++)
|
||||
BLK(ctx->cur, bx + (i & 0x7), by + (i >> 3)) = val;
|
||||
@@ -171,14 +203,22 @@ static void kmvc_decode_inter_8x8(KmvcContext * ctx, const uint8_t * src, int w,
|
||||
for (i = 0; i < 4; i++) {
|
||||
l0x = bx + (i & 1) * 4;
|
||||
l0y = by + (i & 2) * 2;
|
||||
kmvc_getbit(bb, src, res);
|
||||
kmvc_getbit(bb, src, src_end, res);
|
||||
if (!res) {
|
||||
kmvc_getbit(bb, src, res);
|
||||
kmvc_getbit(bb, src, src_end, res);
|
||||
if (!res) { // fill whole 4x4 block
|
||||
if (src >= src_end) {
|
||||
av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
val = *src++;
|
||||
for (j = 0; j < 16; j++)
|
||||
BLK(ctx->cur, l0x + (j & 3), l0y + (j >> 2)) = val;
|
||||
} else { // copy block
|
||||
if (src >= src_end) {
|
||||
av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
val = *src++;
|
||||
mx = (val & 0xF) - 8;
|
||||
my = (val >> 4) - 8;
|
||||
@@ -190,16 +230,24 @@ static void kmvc_decode_inter_8x8(KmvcContext * ctx, const uint8_t * src, int w,
|
||||
for (j = 0; j < 4; j++) {
|
||||
l1x = l0x + (j & 1) * 2;
|
||||
l1y = l0y + (j & 2);
|
||||
kmvc_getbit(bb, src, res);
|
||||
kmvc_getbit(bb, src, src_end, res);
|
||||
if (!res) {
|
||||
kmvc_getbit(bb, src, res);
|
||||
kmvc_getbit(bb, src, src_end, res);
|
||||
if (!res) { // fill whole 2x2 block
|
||||
if (src >= src_end) {
|
||||
av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
val = *src++;
|
||||
BLK(ctx->cur, l1x, l1y) = val;
|
||||
BLK(ctx->cur, l1x + 1, l1y) = val;
|
||||
BLK(ctx->cur, l1x, l1y + 1) = val;
|
||||
BLK(ctx->cur, l1x + 1, l1y + 1) = val;
|
||||
} else { // copy block
|
||||
if (src >= src_end) {
|
||||
av_log(ctx->avctx, AV_LOG_ERROR, "Data overrun\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
val = *src++;
|
||||
mx = (val & 0xF) - 8;
|
||||
my = (val >> 4) - 8;
|
||||
@@ -222,6 +270,8 @@ static void kmvc_decode_inter_8x8(KmvcContext * ctx, const uint8_t * src, int w,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int decode_frame(AVCodecContext * avctx, void *data, int *data_size, AVPacket *avpkt)
|
||||
@@ -299,10 +349,10 @@ static int decode_frame(AVCodecContext * avctx, void *data, int *data_size, AVPa
|
||||
memcpy(ctx->cur, ctx->prev, 320 * 200);
|
||||
break;
|
||||
case 3:
|
||||
kmvc_decode_intra_8x8(ctx, buf, avctx->width, avctx->height);
|
||||
kmvc_decode_intra_8x8(ctx, buf, buf_size, avctx->width, avctx->height);
|
||||
break;
|
||||
case 4:
|
||||
kmvc_decode_inter_8x8(ctx, buf, avctx->width, avctx->height);
|
||||
kmvc_decode_inter_8x8(ctx, buf, buf_size, avctx->width, avctx->height);
|
||||
break;
|
||||
default:
|
||||
av_log(avctx, AV_LOG_ERROR, "Unknown compression method %i\n", header & KMVC_METHOD);
|
||||
|
||||
+29
-8
@@ -223,8 +223,29 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPac
|
||||
len = mszh_dlen;
|
||||
}
|
||||
break;
|
||||
case COMP_MSZH_NOCOMP:
|
||||
case COMP_MSZH_NOCOMP: {
|
||||
int bppx2;
|
||||
switch (c->imgtype) {
|
||||
case IMGTYPE_YUV111:
|
||||
case IMGTYPE_RGB24:
|
||||
bppx2 = 6;
|
||||
break;
|
||||
case IMGTYPE_YUV422:
|
||||
case IMGTYPE_YUV211:
|
||||
bppx2 = 4;
|
||||
break;
|
||||
case IMGTYPE_YUV411:
|
||||
case IMGTYPE_YUV420:
|
||||
bppx2 = 3;
|
||||
break;
|
||||
default:
|
||||
bppx2 = 0; // will error out below
|
||||
break;
|
||||
}
|
||||
if (len < ((width * height * bppx2) >> 1))
|
||||
return AVERROR_INVALIDDATA;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
av_log(avctx, AV_LOG_ERROR, "BUG! Unknown MSZH compression in frame decoder.\n");
|
||||
return -1;
|
||||
@@ -456,7 +477,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
||||
avcodec_get_frame_defaults(&c->pic);
|
||||
if (avctx->extradata_size < 8) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Extradata size too small.\n");
|
||||
return 1;
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
/* Check codec type */
|
||||
@@ -505,7 +526,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
||||
break;
|
||||
default:
|
||||
av_log(avctx, AV_LOG_ERROR, "Unsupported image format %d.\n", c->imgtype);
|
||||
return 1;
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
/* Detect compression method */
|
||||
@@ -522,7 +543,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
||||
break;
|
||||
default:
|
||||
av_log(avctx, AV_LOG_ERROR, "Unsupported compression format for MSZH (%d).\n", c->compression);
|
||||
return 1;
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
break;
|
||||
#if CONFIG_ZLIB_DECODER
|
||||
@@ -540,7 +561,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
||||
default:
|
||||
if (c->compression < Z_NO_COMPRESSION || c->compression > Z_BEST_COMPRESSION) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Unsupported compression level for ZLIB: (%d).\n", c->compression);
|
||||
return 1;
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
av_log(avctx, AV_LOG_DEBUG, "Compression level for ZLIB: (%d).\n", c->compression);
|
||||
}
|
||||
@@ -548,14 +569,14 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
||||
#endif
|
||||
default:
|
||||
av_log(avctx, AV_LOG_ERROR, "BUG! Unknown codec in compression switch.\n");
|
||||
return 1;
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
/* Allocate decompression buffer */
|
||||
if (c->decomp_size) {
|
||||
if ((c->decomp_buf = av_malloc(max_decomp_size)) == NULL) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Can't allocate decompression buffer.\n");
|
||||
return 1;
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -581,7 +602,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
||||
if (zret != Z_OK) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Inflate init error: %d\n", zret);
|
||||
av_freep(&c->decomp_buf);
|
||||
return 1;
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -63,9 +63,7 @@ static av_cold int aacPlus_encode_init(AVCodecContext *avctx)
|
||||
|
||||
aacplus_cfg->bitRate = avctx->bit_rate;
|
||||
aacplus_cfg->bandWidth = avctx->cutoff;
|
||||
if (avctx->flags & CODEC_FLAG_GLOBAL_HEADER) {
|
||||
aacplus_cfg->outputFormat = 0; //raw aac
|
||||
}
|
||||
aacplus_cfg->outputFormat = !(avctx->flags & CODEC_FLAG_GLOBAL_HEADER);
|
||||
aacplus_cfg->inputFormat = AACPLUS_INPUT_16BIT;
|
||||
if (!aacplusEncSetConfiguration(s->aacplus_handle, aacplus_cfg)) {
|
||||
av_log(avctx, AV_LOG_ERROR, "libaacplus doesn't support this output format!\n");
|
||||
|
||||
@@ -59,6 +59,9 @@ read_header:
|
||||
s->restart_count = 0;
|
||||
s->mjpb_skiptosod = 0;
|
||||
|
||||
if (buf_end - buf_ptr >= 1 << 28)
|
||||
return AVERROR_INVALIDDATA;
|
||||
|
||||
init_get_bits(&hgb, buf_ptr, /*buf_size*/(buf_end - buf_ptr)*8);
|
||||
|
||||
skip_bits(&hgb, 32); /* reserved zeros */
|
||||
@@ -66,7 +69,7 @@ read_header:
|
||||
if (get_bits_long(&hgb, 32) != MKBETAG('m','j','p','g'))
|
||||
{
|
||||
av_log(avctx, AV_LOG_WARNING, "not mjpeg-b (bad fourcc)\n");
|
||||
return 0;
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
field_size = get_bits_long(&hgb, 32); /* field size */
|
||||
@@ -109,8 +112,8 @@ read_header:
|
||||
av_log(avctx, AV_LOG_DEBUG, "sod offs: 0x%x\n", sod_offs);
|
||||
if (sos_offs)
|
||||
{
|
||||
// init_get_bits(&s->gb, buf+sos_offs, (buf_end - (buf+sos_offs))*8);
|
||||
init_get_bits(&s->gb, buf_ptr+sos_offs, field_size*8);
|
||||
init_get_bits(&s->gb, buf_ptr + sos_offs,
|
||||
8 * FFMIN(field_size, buf_end - buf_ptr - sos_offs));
|
||||
s->mjpb_skiptosod = (sod_offs - sos_offs - show_bits(&s->gb, 16));
|
||||
s->start_code = SOS;
|
||||
ff_mjpeg_decode_sos(s, NULL, NULL);
|
||||
@@ -142,7 +145,7 @@ read_header:
|
||||
picture->quality*= FF_QP2LAMBDA;
|
||||
}
|
||||
|
||||
return buf_ptr - buf;
|
||||
return buf_size;
|
||||
}
|
||||
|
||||
AVCodec ff_mjpegb_decoder = {
|
||||
|
||||
@@ -52,7 +52,7 @@ static inline int sad_hpel_motion_search(MpegEncContext * s,
|
||||
int src_index, int ref_index,
|
||||
int size, int h);
|
||||
|
||||
static inline int update_map_generation(MotionEstContext *c)
|
||||
static inline unsigned update_map_generation(MotionEstContext *c)
|
||||
{
|
||||
c->map_generation+= 1<<(ME_MAP_MV_BITS*2);
|
||||
if(c->map_generation==0){
|
||||
|
||||
@@ -158,9 +158,8 @@ static int hpel_motion_search(MpegEncContext * s,
|
||||
const int b= score_map[(index+(1<<ME_MAP_SHIFT))&(ME_MAP_SIZE-1)]
|
||||
+ (mv_penalty[bx - pred_x] + mv_penalty[by+2 - pred_y])*c->penalty_factor;
|
||||
|
||||
#if 1
|
||||
int key;
|
||||
int map_generation= c->map_generation;
|
||||
unsigned key;
|
||||
unsigned map_generation= c->map_generation;
|
||||
#ifndef NDEBUG
|
||||
uint32_t *map= c->map;
|
||||
#endif
|
||||
@@ -172,7 +171,6 @@ static int hpel_motion_search(MpegEncContext * s,
|
||||
assert(map[(index+1)&(ME_MAP_SIZE-1)] == key);
|
||||
key= ((my)<<ME_MAP_MV_BITS) + (mx-1) + map_generation;
|
||||
assert(map[(index-1)&(ME_MAP_SIZE-1)] == key);
|
||||
#endif
|
||||
if(t<=b){
|
||||
CHECK_HALF_MV(0, 1, mx ,my-1)
|
||||
if(l<=r){
|
||||
@@ -280,7 +278,7 @@ static int qpel_motion_search(MpegEncContext * s,
|
||||
const int mx = *mx_ptr;
|
||||
const int my = *my_ptr;
|
||||
const int penalty_factor= c->sub_penalty_factor;
|
||||
const int map_generation= c->map_generation;
|
||||
const unsigned map_generation = c->map_generation;
|
||||
const int subpel_quality= c->avctx->me_subpel_quality;
|
||||
uint32_t *map= c->map;
|
||||
me_cmp_func cmpf, chroma_cmpf;
|
||||
@@ -497,7 +495,7 @@ static int qpel_motion_search(MpegEncContext * s,
|
||||
|
||||
#define CHECK_MV(x,y)\
|
||||
{\
|
||||
const int key= ((y)<<ME_MAP_MV_BITS) + (x) + map_generation;\
|
||||
const unsigned key = ((y)<<ME_MAP_MV_BITS) + (x) + map_generation;\
|
||||
const int index= (((y)<<ME_MAP_SHIFT) + (x))&(ME_MAP_SIZE-1);\
|
||||
assert((x) >= xmin);\
|
||||
assert((x) <= xmax);\
|
||||
@@ -525,7 +523,7 @@ static int qpel_motion_search(MpegEncContext * s,
|
||||
|
||||
#define CHECK_MV_DIR(x,y,new_dir)\
|
||||
{\
|
||||
const int key= ((y)<<ME_MAP_MV_BITS) + (x) + map_generation;\
|
||||
const unsigned key = ((y)<<ME_MAP_MV_BITS) + (x) + map_generation;\
|
||||
const int index= (((y)<<ME_MAP_SHIFT) + (x))&(ME_MAP_SIZE-1);\
|
||||
/*printf("check_mv_dir %d %d %d\n", x, y, new_dir);*/\
|
||||
if(map[index]!=key){\
|
||||
@@ -563,13 +561,13 @@ static av_always_inline int small_diamond_search(MpegEncContext * s, int *best,
|
||||
int next_dir=-1;
|
||||
LOAD_COMMON
|
||||
LOAD_COMMON2
|
||||
int map_generation= c->map_generation;
|
||||
unsigned map_generation = c->map_generation;
|
||||
|
||||
cmpf= s->dsp.me_cmp[size];
|
||||
chroma_cmpf= s->dsp.me_cmp[size+1];
|
||||
|
||||
{ /* ensure that the best point is in the MAP as h/qpel refinement needs it */
|
||||
const int key= (best[1]<<ME_MAP_MV_BITS) + best[0] + map_generation;
|
||||
const unsigned key = (best[1]<<ME_MAP_MV_BITS) + best[0] + map_generation;
|
||||
const int index= ((best[1]<<ME_MAP_SHIFT) + best[0])&(ME_MAP_SIZE-1);
|
||||
if(map[index]!=key){ //this will be executed only very rarey
|
||||
score_map[index]= cmp(s, best[0], best[1], 0, 0, size, h, ref_index, src_index, cmpf, chroma_cmpf, flags);
|
||||
@@ -605,7 +603,7 @@ static int funny_diamond_search(MpegEncContext * s, int *best, int dmin,
|
||||
int dia_size;
|
||||
LOAD_COMMON
|
||||
LOAD_COMMON2
|
||||
int map_generation= c->map_generation;
|
||||
unsigned map_generation = c->map_generation;
|
||||
|
||||
cmpf= s->dsp.me_cmp[size];
|
||||
chroma_cmpf= s->dsp.me_cmp[size+1];
|
||||
@@ -646,7 +644,7 @@ static int hex_search(MpegEncContext * s, int *best, int dmin,
|
||||
me_cmp_func cmpf, chroma_cmpf;
|
||||
LOAD_COMMON
|
||||
LOAD_COMMON2
|
||||
int map_generation= c->map_generation;
|
||||
unsigned map_generation = c->map_generation;
|
||||
int x,y,d;
|
||||
const int dec= dia_size & (dia_size-1);
|
||||
|
||||
@@ -680,7 +678,7 @@ static int l2s_dia_search(MpegEncContext * s, int *best, int dmin,
|
||||
me_cmp_func cmpf, chroma_cmpf;
|
||||
LOAD_COMMON
|
||||
LOAD_COMMON2
|
||||
int map_generation= c->map_generation;
|
||||
unsigned map_generation = c->map_generation;
|
||||
int x,y,i,d;
|
||||
int dia_size= c->dia_size&0xFF;
|
||||
const int dec= dia_size & (dia_size-1);
|
||||
@@ -718,7 +716,7 @@ static int umh_search(MpegEncContext * s, int *best, int dmin,
|
||||
me_cmp_func cmpf, chroma_cmpf;
|
||||
LOAD_COMMON
|
||||
LOAD_COMMON2
|
||||
int map_generation= c->map_generation;
|
||||
unsigned map_generation = c->map_generation;
|
||||
int x,y,x2,y2, i, j, d;
|
||||
const int dia_size= c->dia_size&0xFE;
|
||||
static const int hex[16][2]={{-4,-2}, {-4,-1}, {-4, 0}, {-4, 1}, {-4, 2},
|
||||
@@ -765,7 +763,7 @@ static int full_search(MpegEncContext * s, int *best, int dmin,
|
||||
me_cmp_func cmpf, chroma_cmpf;
|
||||
LOAD_COMMON
|
||||
LOAD_COMMON2
|
||||
int map_generation= c->map_generation;
|
||||
unsigned map_generation = c->map_generation;
|
||||
int x,y, d;
|
||||
const int dia_size= c->dia_size&0xFF;
|
||||
|
||||
@@ -794,7 +792,7 @@ static int full_search(MpegEncContext * s, int *best, int dmin,
|
||||
|
||||
#define SAB_CHECK_MV(ax,ay)\
|
||||
{\
|
||||
const int key= ((ay)<<ME_MAP_MV_BITS) + (ax) + map_generation;\
|
||||
const unsigned key = ((ay)<<ME_MAP_MV_BITS) + (ax) + map_generation;\
|
||||
const int index= (((ay)<<ME_MAP_SHIFT) + (ax))&(ME_MAP_SIZE-1);\
|
||||
/*printf("sab check %d %d\n", ax, ay);*/\
|
||||
if(map[index]!=key){\
|
||||
@@ -833,7 +831,7 @@ static int sab_diamond_search(MpegEncContext * s, int *best, int dmin,
|
||||
int i, j;
|
||||
LOAD_COMMON
|
||||
LOAD_COMMON2
|
||||
int map_generation= c->map_generation;
|
||||
unsigned map_generation = c->map_generation;
|
||||
|
||||
cmpf= s->dsp.me_cmp[size];
|
||||
chroma_cmpf= s->dsp.me_cmp[size+1];
|
||||
@@ -918,7 +916,7 @@ static int var_diamond_search(MpegEncContext * s, int *best, int dmin,
|
||||
int dia_size;
|
||||
LOAD_COMMON
|
||||
LOAD_COMMON2
|
||||
int map_generation= c->map_generation;
|
||||
unsigned map_generation = c->map_generation;
|
||||
|
||||
cmpf= s->dsp.me_cmp[size];
|
||||
chroma_cmpf= s->dsp.me_cmp[size+1];
|
||||
@@ -1010,7 +1008,7 @@ static av_always_inline int epzs_motion_search_internal(MpegEncContext * s, int
|
||||
int d; ///< the score (cmp + penalty) of any given mv
|
||||
int dmin; /*!< the best value of d, i.e. the score
|
||||
corresponding to the mv stored in best[]. */
|
||||
int map_generation;
|
||||
unsigned map_generation;
|
||||
int penalty_factor;
|
||||
const int ref_mv_stride= s->mb_stride; //pass as arg FIXME
|
||||
const int ref_mv_xy= s->mb_x + s->mb_y*ref_mv_stride; //add to last_mv beforepassing FIXME
|
||||
@@ -1138,7 +1136,7 @@ static int epzs_motion_search4(MpegEncContext * s,
|
||||
MotionEstContext * const c= &s->me;
|
||||
int best[2]={0, 0};
|
||||
int d, dmin;
|
||||
int map_generation;
|
||||
unsigned map_generation;
|
||||
const int penalty_factor= c->penalty_factor;
|
||||
const int size=1;
|
||||
const int h=8;
|
||||
@@ -1198,7 +1196,7 @@ static int epzs_motion_search2(MpegEncContext * s,
|
||||
MotionEstContext * const c= &s->me;
|
||||
int best[2]={0, 0};
|
||||
int d, dmin;
|
||||
int map_generation;
|
||||
unsigned map_generation;
|
||||
const int penalty_factor= c->penalty_factor;
|
||||
const int size=0; //FIXME pass as arg
|
||||
const int h=8;
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
|
||||
#include "avcodec.h"
|
||||
#include "dsputil.h"
|
||||
#include "mathops.h"
|
||||
#include "mpegvideo.h"
|
||||
|
||||
#include "mpeg12.h"
|
||||
@@ -681,8 +682,7 @@ static void mpeg1_encode_motion(MpegEncContext *s, int val, int f_or_b_code)
|
||||
int bit_size = f_or_b_code - 1;
|
||||
int range = 1 << bit_size;
|
||||
/* modulo encoding */
|
||||
int l= INT_BIT - 5 - bit_size;
|
||||
val= (val<<l)>>l;
|
||||
val = sign_extend(val, 5 + bit_size);
|
||||
|
||||
if (val >= 0) {
|
||||
val--;
|
||||
|
||||
@@ -366,8 +366,8 @@ static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){
|
||||
int i;
|
||||
|
||||
// edge emu needs blocksize + filter length - 1 (=17x17 for halfpel / 21x21 for h264)
|
||||
FF_ALLOCZ_OR_GOTO(s->avctx, s->allocated_edge_emu_buffer, (s->width+64)*2*21*2*2, fail); //(width + edge + align)*interlaced*MBsize*tolerance
|
||||
s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*21*2;
|
||||
FF_ALLOCZ_OR_GOTO(s->avctx, s->edge_emu_buffer, (s->width+64)*2*21*2*2, fail); //(width + edge + align)*interlaced*MBsize*tolerance
|
||||
|
||||
|
||||
//FIXME should be linesize instead of s->width*2 but that is not known before get_buffer()
|
||||
FF_ALLOCZ_OR_GOTO(s->avctx, s->me.scratchpad, (s->width+64)*4*16*2*sizeof(uint8_t), fail)
|
||||
@@ -405,7 +405,7 @@ fail:
|
||||
static void free_duplicate_context(MpegEncContext *s){
|
||||
if(s==NULL) return;
|
||||
|
||||
av_freep(&s->allocated_edge_emu_buffer); s->edge_emu_buffer= NULL;
|
||||
av_freep(&s->edge_emu_buffer);
|
||||
av_freep(&s->me.scratchpad);
|
||||
s->me.temp=
|
||||
s->rd_scratchpad=
|
||||
@@ -422,7 +422,6 @@ static void free_duplicate_context(MpegEncContext *s){
|
||||
|
||||
static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src){
|
||||
#define COPY(a) bak->a= src->a
|
||||
COPY(allocated_edge_emu_buffer);
|
||||
COPY(edge_emu_buffer);
|
||||
COPY(me.scratchpad);
|
||||
COPY(me.temp);
|
||||
|
||||
@@ -153,7 +153,7 @@ typedef struct MotionEstContext{
|
||||
int best_bits;
|
||||
uint32_t *map; ///< map to avoid duplicate evaluations
|
||||
uint32_t *score_map; ///< map to store the scores
|
||||
int map_generation;
|
||||
unsigned map_generation;
|
||||
int pre_penalty_factor;
|
||||
int penalty_factor; /*!< an estimate of the bits required to
|
||||
code a given mv value, e.g. (1,0) takes
|
||||
@@ -317,8 +317,7 @@ typedef struct MpegEncContext {
|
||||
uint8_t *mbintra_table; ///< used to avoid setting {ac, dc, cbp}-pred stuff to zero on inter MB decoding
|
||||
uint8_t *cbp_table; ///< used to store cbp, ac_pred for partitioned decoding
|
||||
uint8_t *pred_dir_table; ///< used to store pred_dir for partitioned decoding
|
||||
uint8_t *allocated_edge_emu_buffer;
|
||||
uint8_t *edge_emu_buffer; ///< points into the middle of allocated_edge_emu_buffer
|
||||
uint8_t *edge_emu_buffer; ///< temporary buffer for if MVs point to out-of-frame data
|
||||
uint8_t *rd_scratchpad; ///< scratchpad for rate distortion mb decision
|
||||
uint8_t *obmc_scratchpad;
|
||||
uint8_t *b_scratchpad; ///< scratchpad used for writing into write only buffers
|
||||
|
||||
@@ -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++){
|
||||
|
||||
@@ -157,19 +157,26 @@ static int decode_tag(AVCodecContext * avctx,
|
||||
int buf_size = avpkt->size;
|
||||
NellyMoserDecodeContext *s = avctx->priv_data;
|
||||
int data_max = *data_size;
|
||||
int blocks, i;
|
||||
int blocks, i, block_size;
|
||||
int16_t* samples;
|
||||
*data_size = 0;
|
||||
samples = (int16_t*)data;
|
||||
|
||||
if (buf_size < avctx->block_align)
|
||||
if (buf_size < avctx->block_align) {
|
||||
*data_size = 0;
|
||||
return buf_size;
|
||||
}
|
||||
|
||||
if (buf_size % 64) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Tag size %d.\n", buf_size);
|
||||
*data_size = 0;
|
||||
return buf_size;
|
||||
}
|
||||
blocks = buf_size / 64;
|
||||
block_size = NELLY_SAMPLES * av_get_bytes_per_sample(avctx->sample_fmt);
|
||||
blocks = FFMIN(buf_size / 64, *data_size / block_size);
|
||||
if (blocks <= 0) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Output buffer is too small\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
/* Normal numbers of blocks for sample rates:
|
||||
* 8000 Hz - 1
|
||||
* 11025 Hz - 2
|
||||
@@ -183,8 +190,8 @@ static int decode_tag(AVCodecContext * avctx,
|
||||
return i > 0 ? i * NELLY_BLOCK_LEN : -1;
|
||||
nelly_decode_block(s, &buf[i*NELLY_BLOCK_LEN], s->float_buf);
|
||||
s->fmt_conv.float_to_int16(&samples[i*NELLY_SAMPLES], s->float_buf, NELLY_SAMPLES);
|
||||
*data_size += NELLY_SAMPLES*sizeof(int16_t);
|
||||
}
|
||||
*data_size = blocks * block_size;
|
||||
|
||||
return buf_size;
|
||||
}
|
||||
|
||||
+26
-12
@@ -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;
|
||||
}
|
||||
|
||||
+2
-1
@@ -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;
|
||||
|
||||
+1
-1
@@ -55,7 +55,7 @@ static void png_get_interlaced_row(uint8_t *dst, int row_size,
|
||||
uint8_t *d;
|
||||
const uint8_t *s;
|
||||
|
||||
mask = ff_png_pass_mask[pass];
|
||||
mask = (int[]){0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff}[pass];
|
||||
switch(bits_per_pixel) {
|
||||
case 1:
|
||||
memset(dst, 0, row_size);
|
||||
|
||||
@@ -60,7 +60,6 @@ static int ptx_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
|
||||
|
||||
avctx->pix_fmt = PIX_FMT_RGB555;
|
||||
|
||||
|
||||
if (buf_end - buf < offset)
|
||||
return AVERROR_INVALIDDATA;
|
||||
if (offset != 0x2c)
|
||||
|
||||
+12
-3
@@ -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;
|
||||
@@ -1815,6 +1816,10 @@ static av_cold int qdm2_decode_init(AVCodecContext *avctx)
|
||||
extradata += 4;
|
||||
|
||||
s->checksum_size = AV_RB32(extradata);
|
||||
if (s->checksum_size >= 1U << 28) {
|
||||
av_log(avctx, AV_LOG_ERROR, "data block size too large (%u)\n", s->checksum_size);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
s->fft_order = av_log2(s->fft_size) + 1;
|
||||
s->fft_frame_size = 2 * s->fft_size; // complex has two floats
|
||||
@@ -1822,7 +1827,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 +1899,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;
|
||||
|
||||
+1
-1
@@ -419,7 +419,7 @@ static av_cold int qtrle_decode_init(AVCodecContext *avctx)
|
||||
default:
|
||||
av_log (avctx, AV_LOG_ERROR, "Unsupported colorspace: %d bits/sample?\n",
|
||||
avctx->bits_per_coded_sample);
|
||||
break;
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
avcodec_get_frame_defaults(&s->frame);
|
||||
|
||||
+3
-3
@@ -151,6 +151,9 @@ static int raw_decode(AVCodecContext *avctx,
|
||||
frame->top_field_first = context->tff;
|
||||
}
|
||||
|
||||
if(buf_size < context->length - (avctx->pix_fmt==PIX_FMT_PAL8 ? 256*4 : 0))
|
||||
return -1;
|
||||
|
||||
//2bpp and 4bpp raw in avi and mov (yes this is ugly ...)
|
||||
if (context->buffer) {
|
||||
int i;
|
||||
@@ -175,9 +178,6 @@ static int raw_decode(AVCodecContext *avctx,
|
||||
avctx->codec_tag == MKTAG('A', 'V', 'u', 'p'))
|
||||
buf += buf_size - context->length;
|
||||
|
||||
if(buf_size < context->length - (avctx->pix_fmt==PIX_FMT_PAL8 ? 256*4 : 0))
|
||||
return -1;
|
||||
|
||||
avpicture_fill(picture, buf, avctx->pix_fmt, avctx->width, avctx->height);
|
||||
if((avctx->pix_fmt==PIX_FMT_PAL8 && buf_size < context->length) ||
|
||||
(avctx->pix_fmt!=PIX_FMT_PAL8 &&
|
||||
|
||||
@@ -183,6 +183,8 @@ static void rpza_decode_stream(RpzaContext *s)
|
||||
color4[1] |= ((11 * ta + 21 * tb) >> 5);
|
||||
color4[2] |= ((21 * ta + 11 * tb) >> 5);
|
||||
|
||||
if (s->size - stream_ptr < n_blocks * 4)
|
||||
return;
|
||||
while (n_blocks--) {
|
||||
block_ptr = row_ptr + pixel_ptr;
|
||||
for (pixel_y = 0; pixel_y < 4; pixel_y++) {
|
||||
@@ -200,6 +202,8 @@ static void rpza_decode_stream(RpzaContext *s)
|
||||
|
||||
/* Fill block with 16 colors */
|
||||
case 0x00:
|
||||
if (s->size - stream_ptr < 16)
|
||||
return;
|
||||
block_ptr = row_ptr + pixel_ptr;
|
||||
for (pixel_y = 0; pixel_y < 4; pixel_y++) {
|
||||
for (pixel_x = 0; pixel_x < 4; pixel_x++){
|
||||
|
||||
+5
-1
@@ -672,8 +672,12 @@ static int rv10_decode_frame(AVCodecContext *avctx,
|
||||
|
||||
if(!avctx->slice_count){
|
||||
slice_count = (*buf++) + 1;
|
||||
buf_size--;
|
||||
slices_hdr = buf + 4;
|
||||
buf += 8 * slice_count;
|
||||
buf_size -= 8 * slice_count;
|
||||
if (buf_size <= 0)
|
||||
return AVERROR_INVALIDDATA;
|
||||
}else
|
||||
slice_count = avctx->slice_count;
|
||||
|
||||
@@ -712,7 +716,7 @@ static int rv10_decode_frame(AVCodecContext *avctx,
|
||||
s->current_picture_ptr= NULL; //so we can detect if frame_end wasnt called (find some nicer solution...)
|
||||
}
|
||||
|
||||
return buf_size;
|
||||
return avpkt->size;
|
||||
}
|
||||
|
||||
AVCodec ff_rv10_decoder = {
|
||||
|
||||
@@ -81,6 +81,7 @@ typedef struct ShortenContext {
|
||||
int channels;
|
||||
|
||||
int32_t *decoded[MAX_CHANNELS];
|
||||
int32_t *decoded_base[MAX_CHANNELS];
|
||||
int32_t *offset[MAX_CHANNELS];
|
||||
int *coeffs;
|
||||
uint8_t *bitstream;
|
||||
@@ -130,13 +131,14 @@ static int allocate_buffers(ShortenContext *s)
|
||||
return AVERROR(ENOMEM);
|
||||
s->offset[chan] = tmp_ptr;
|
||||
|
||||
tmp_ptr = av_realloc(s->decoded[chan], sizeof(int32_t)*(s->blocksize + s->nwrap));
|
||||
tmp_ptr = av_realloc(s->decoded_base[chan], (s->blocksize + s->nwrap) *
|
||||
sizeof(s->decoded_base[0][0]));
|
||||
if (!tmp_ptr)
|
||||
return AVERROR(ENOMEM);
|
||||
s->decoded[chan] = tmp_ptr;
|
||||
s->decoded_base[chan] = tmp_ptr;
|
||||
for (i=0; i<s->nwrap; i++)
|
||||
s->decoded[chan][i] = 0;
|
||||
s->decoded[chan] += s->nwrap;
|
||||
s->decoded_base[chan][i] = 0;
|
||||
s->decoded[chan] = s->decoded_base[chan] + s->nwrap;
|
||||
}
|
||||
|
||||
coeffs = av_realloc(s->coeffs, s->nwrap * sizeof(*s->coeffs));
|
||||
@@ -548,8 +550,8 @@ static av_cold int shorten_decode_close(AVCodecContext *avctx)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < s->channels; i++) {
|
||||
s->decoded[i] -= s->nwrap;
|
||||
av_freep(&s->decoded[i]);
|
||||
s->decoded[i] = NULL;
|
||||
av_freep(&s->decoded_base[i]);
|
||||
av_freep(&s->offset[i]);
|
||||
}
|
||||
av_freep(&s->bitstream);
|
||||
|
||||
+13
-9
@@ -127,12 +127,12 @@ static int smacker_decode_tree(GetBitContext *gb, HuffContext *hc, uint32_t pref
|
||||
*/
|
||||
static int smacker_decode_bigtree(GetBitContext *gb, HuffContext *hc, DBCtx *ctx)
|
||||
{
|
||||
if (hc->current + 1 >= hc->length) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Tree size exceeded!\n");
|
||||
return -1;
|
||||
}
|
||||
if(!get_bits1(gb)){ //Leaf
|
||||
int val, i1, i2, b1, b2;
|
||||
if(hc->current >= hc->length){
|
||||
av_log(NULL, AV_LOG_ERROR, "Tree size exceeded!\n");
|
||||
return -1;
|
||||
}
|
||||
b1 = get_bits_count(gb);
|
||||
i1 = ctx->v1->table ? get_vlc2(gb, ctx->v1->table, SMKTREE_BITS, 3) : 0;
|
||||
b1 = get_bits_count(gb) - b1;
|
||||
@@ -156,7 +156,7 @@ static int smacker_decode_bigtree(GetBitContext *gb, HuffContext *hc, DBCtx *ctx
|
||||
hc->values[hc->current++] = val;
|
||||
return 1;
|
||||
} else { //Node
|
||||
int r = 0, t;
|
||||
int r = 0, r_new, t;
|
||||
|
||||
t = hc->current++;
|
||||
r = smacker_decode_bigtree(gb, hc, ctx);
|
||||
@@ -164,8 +164,10 @@ static int smacker_decode_bigtree(GetBitContext *gb, HuffContext *hc, DBCtx *ctx
|
||||
return r;
|
||||
hc->values[t] = SMK_NODE | r;
|
||||
r++;
|
||||
r += smacker_decode_bigtree(gb, hc, ctx);
|
||||
return r;
|
||||
r_new = smacker_decode_bigtree(gb, hc, ctx);
|
||||
if (r_new < 0)
|
||||
return r_new;
|
||||
return r + r_new;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -180,6 +182,7 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int
|
||||
VLC vlc[2];
|
||||
int escapes[3];
|
||||
DBCtx ctx;
|
||||
int err = 0;
|
||||
|
||||
if(size >= UINT_MAX>>4){ // (((size + 3) >> 2) + 3) << 2 must not overflow
|
||||
av_log(smk->avctx, AV_LOG_ERROR, "size too large\n");
|
||||
@@ -253,7 +256,8 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int
|
||||
huff.current = 0;
|
||||
huff.values = av_mallocz(huff.length * sizeof(int));
|
||||
|
||||
smacker_decode_bigtree(gb, &huff, &ctx);
|
||||
if (smacker_decode_bigtree(gb, &huff, &ctx) < 0)
|
||||
err = -1;
|
||||
skip_bits1(gb);
|
||||
if(ctx.last[0] == -1) ctx.last[0] = huff.current++;
|
||||
if(ctx.last[1] == -1) ctx.last[1] = huff.current++;
|
||||
@@ -272,7 +276,7 @@ static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int
|
||||
av_free(tmp2.lengths);
|
||||
av_free(tmp2.values);
|
||||
|
||||
return 0;
|
||||
return err;
|
||||
}
|
||||
|
||||
static int decode_header_trees(SmackVContext *smk) {
|
||||
|
||||
+2
-2
@@ -110,7 +110,7 @@ static const char *srt_to_ass(AVCodecContext *avctx, char *out, char *out_end,
|
||||
for (j=sptr-2; j>=0; j--)
|
||||
if (stack[j].param[i][0]) {
|
||||
out += snprintf(out, out_end-out,
|
||||
stack[j].param[i]);
|
||||
"%s", stack[j].param[i]);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
@@ -146,7 +146,7 @@ static const char *srt_to_ass(AVCodecContext *avctx, char *out, char *out_end,
|
||||
for (i=0; i<PARAM_NUMBER; i++)
|
||||
if (stack[sptr].param[i][0])
|
||||
out += snprintf(out, out_end-out,
|
||||
stack[sptr].param[i]);
|
||||
"%s", stack[sptr].param[i]);
|
||||
}
|
||||
} else if (!buffer[1] && strspn(buffer, "bisu") == 1) {
|
||||
out += snprintf(out, out_end-out,
|
||||
|
||||
@@ -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
|
||||
|
||||
+16
-7
@@ -612,7 +612,7 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type)
|
||||
dir = i_mb_type_info[mb_type - 8].pred_mode;
|
||||
dir = (dir >> 1) ^ 3*(dir & 1) ^ 1;
|
||||
|
||||
if ((h->intra16x16_pred_mode = ff_h264_check_intra16x16_pred_mode(h, dir)) == -1){
|
||||
if ((h->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h, dir, 0)) == -1){
|
||||
av_log(h->s.avctx, AV_LOG_ERROR, "check_intra_pred_mode = -1\n");
|
||||
return -1;
|
||||
}
|
||||
@@ -711,7 +711,7 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type)
|
||||
s->current_picture.mb_type[mb_xy] = mb_type;
|
||||
|
||||
if (IS_INTRA(mb_type)) {
|
||||
h->chroma_pred_mode = ff_h264_check_intra_chroma_pred_mode(h, DC_PRED8x8);
|
||||
h->chroma_pred_mode = ff_h264_check_intra_pred_mode(h, DC_PRED8x8, 1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -811,7 +811,9 @@ static av_cold int svq3_decode_init(AVCodecContext *avctx)
|
||||
MpegEncContext *s = &h->s;
|
||||
int m;
|
||||
unsigned char *extradata;
|
||||
unsigned char *extradata_end;
|
||||
unsigned int size;
|
||||
int marker_found = 0;
|
||||
|
||||
if (ff_h264_decode_init(avctx) < 0)
|
||||
return -1;
|
||||
@@ -832,19 +834,26 @@ static av_cold int svq3_decode_init(AVCodecContext *avctx)
|
||||
|
||||
/* prowl for the "SEQH" marker in the extradata */
|
||||
extradata = (unsigned char *)avctx->extradata;
|
||||
for (m = 0; m < avctx->extradata_size; m++) {
|
||||
if (!memcmp(extradata, "SEQH", 4))
|
||||
break;
|
||||
extradata++;
|
||||
extradata_end = avctx->extradata + avctx->extradata_size;
|
||||
if (extradata) {
|
||||
for (m = 0; m + 8 < avctx->extradata_size; m++) {
|
||||
if (!memcmp(extradata, "SEQH", 4)) {
|
||||
marker_found = 1;
|
||||
break;
|
||||
}
|
||||
extradata++;
|
||||
}
|
||||
}
|
||||
|
||||
/* if a match was found, parse the extra data */
|
||||
if (extradata && !memcmp(extradata, "SEQH", 4)) {
|
||||
if (marker_found) {
|
||||
|
||||
GetBitContext gb;
|
||||
int frame_size_code;
|
||||
|
||||
size = AV_RB32(&extradata[4]);
|
||||
if (size > extradata_end - extradata - 8)
|
||||
return AVERROR_INVALIDDATA;
|
||||
init_get_bits(&gb, extradata + 8, size*8);
|
||||
|
||||
/* 'frame size code' and optional 'width, height' */
|
||||
|
||||
+22
-13
@@ -56,24 +56,24 @@ typedef struct TiffContext {
|
||||
LZWState *lzw;
|
||||
} TiffContext;
|
||||
|
||||
static int tget_short(const uint8_t **p, int le){
|
||||
int v = le ? AV_RL16(*p) : AV_RB16(*p);
|
||||
static unsigned tget_short(const uint8_t **p, int le) {
|
||||
unsigned v = le ? AV_RL16(*p) : AV_RB16(*p);
|
||||
*p += 2;
|
||||
return v;
|
||||
}
|
||||
|
||||
static int tget_long(const uint8_t **p, int le){
|
||||
int v = le ? AV_RL32(*p) : AV_RB32(*p);
|
||||
static unsigned tget_long(const uint8_t **p, int le) {
|
||||
unsigned v = le ? AV_RL32(*p) : AV_RB32(*p);
|
||||
*p += 4;
|
||||
return v;
|
||||
}
|
||||
|
||||
static int tget(const uint8_t **p, int type, int le){
|
||||
static unsigned tget(const uint8_t **p, int type, int le) {
|
||||
switch(type){
|
||||
case TIFF_BYTE : return *(*p)++;
|
||||
case TIFF_SHORT: return tget_short(p, le);
|
||||
case TIFF_LONG : return tget_long (p, le);
|
||||
default : return -1;
|
||||
default : return UINT_MAX;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -274,7 +274,7 @@ static int init_image(TiffContext *s)
|
||||
|
||||
static int tiff_decode_tag(TiffContext *s, const uint8_t *start, const uint8_t *buf, const uint8_t *end_buf)
|
||||
{
|
||||
int tag, type, count, off, value = 0;
|
||||
unsigned tag, type, count, off, value = 0;
|
||||
int i, j;
|
||||
uint32_t *pal;
|
||||
const uint8_t *rp, *gp, *bp;
|
||||
@@ -286,6 +286,11 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start, const uint8_t *
|
||||
count = tget_long(&buf, s->le);
|
||||
off = tget_long(&buf, s->le);
|
||||
|
||||
if (type == 0 || type >= FF_ARRAY_ELEMS(type_sizes)) {
|
||||
av_log(s->avctx, AV_LOG_DEBUG, "Unknown tiff type (%u) encountered\n", type);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(count == 1){
|
||||
switch(type){
|
||||
case TIFF_BYTE:
|
||||
@@ -304,13 +309,15 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start, const uint8_t *
|
||||
break;
|
||||
}
|
||||
default:
|
||||
value = -1;
|
||||
value = UINT_MAX;
|
||||
buf = start + off;
|
||||
}
|
||||
} else {
|
||||
if (count <= 4 && type_sizes[type] * count <= 4) {
|
||||
buf -= 4;
|
||||
} else {
|
||||
buf = start + off;
|
||||
}
|
||||
}else if(type_sizes[type] * count <= 4){
|
||||
buf -= 4;
|
||||
}else{
|
||||
buf = start + off;
|
||||
}
|
||||
|
||||
if(buf && (buf < start || buf > end_buf)){
|
||||
@@ -388,7 +395,7 @@ static int tiff_decode_tag(TiffContext *s, const uint8_t *start, const uint8_t *
|
||||
}
|
||||
break;
|
||||
case TIFF_ROWSPERSTRIP:
|
||||
if(type == TIFF_LONG && value == -1)
|
||||
if (type == TIFF_LONG && value == UINT_MAX)
|
||||
value = s->avctx->height;
|
||||
if(value < 1){
|
||||
av_log(s->avctx, AV_LOG_ERROR, "Incorrect value of rows per strip\n");
|
||||
@@ -526,6 +533,8 @@ static int decode_frame(AVCodecContext *avctx,
|
||||
av_log(avctx, AV_LOG_ERROR, "The answer to life, universe and everything is not correct!\n");
|
||||
return -1;
|
||||
}
|
||||
// Reset these pointers so we can tell if they were set this frame
|
||||
s->stripsizes = s->stripdata = NULL;
|
||||
/* parse image file directory */
|
||||
off = tget_long(&buf, le);
|
||||
if (off >= UINT_MAX - 14 || end_buf - orig_buf < off + 14) {
|
||||
|
||||
@@ -132,7 +132,7 @@ static int tm2_build_huff_table(TM2Context *ctx, TM2Codes *code)
|
||||
huff.val_bits, huff.max_bits);
|
||||
return -1;
|
||||
}
|
||||
if((huff.nodes < 0) || (huff.nodes > 0x10000)) {
|
||||
if((huff.nodes <= 0) || (huff.nodes > 0x10000)) {
|
||||
av_log(ctx->avctx, AV_LOG_ERROR, "Incorrect number of Huffman tree nodes: %i\n", huff.nodes);
|
||||
return -1;
|
||||
}
|
||||
|
||||
+23
-1
@@ -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;
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -484,6 +484,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
||||
break;
|
||||
default:
|
||||
av_log(avctx, AV_LOG_ERROR, "Unsupported bitdepth %i\n", c->bpp);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
+10
-10
@@ -150,7 +150,7 @@ void ff_vorbis_ready_floor1_list(vorbis_floor1_entry * list, int values)
|
||||
}
|
||||
}
|
||||
|
||||
static inline void render_line_unrolled(intptr_t x, intptr_t y, int x1,
|
||||
static inline void render_line_unrolled(intptr_t x, int y, int x1,
|
||||
intptr_t sy, int ady, int adx,
|
||||
float *buf)
|
||||
{
|
||||
@@ -162,14 +162,14 @@ static inline void render_line_unrolled(intptr_t x, intptr_t y, int x1,
|
||||
if (err >= 0) {
|
||||
err += ady - adx;
|
||||
y += sy;
|
||||
buf[x++] = ff_vorbis_floor1_inverse_db_table[y];
|
||||
buf[x++] = ff_vorbis_floor1_inverse_db_table[av_clip_uint8(y)];
|
||||
}
|
||||
buf[x] = ff_vorbis_floor1_inverse_db_table[y];
|
||||
buf[x] = ff_vorbis_floor1_inverse_db_table[av_clip_uint8(y)];
|
||||
}
|
||||
if (x <= 0) {
|
||||
if (err + ady >= 0)
|
||||
y += sy;
|
||||
buf[x] = ff_vorbis_floor1_inverse_db_table[y];
|
||||
buf[x] = ff_vorbis_floor1_inverse_db_table[av_clip_uint8(y)];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -179,14 +179,14 @@ static void render_line(int x0, int y0, int x1, int y1, float *buf)
|
||||
int adx = x1 - x0;
|
||||
int ady = FFABS(dy);
|
||||
int sy = dy < 0 ? -1 : 1;
|
||||
buf[x0] = ff_vorbis_floor1_inverse_db_table[y0];
|
||||
buf[x0] = ff_vorbis_floor1_inverse_db_table[av_clip_uint8(y0)];
|
||||
if (ady*2 <= adx) { // optimized common case
|
||||
render_line_unrolled(x0, y0, x1, sy, ady, adx, buf);
|
||||
} else {
|
||||
int base = dy / adx;
|
||||
int x = x0;
|
||||
int y = y0;
|
||||
int err = -adx;
|
||||
int base = dy / adx;
|
||||
int x = x0;
|
||||
int y = y0;
|
||||
int err = -adx;
|
||||
ady -= FFABS(base) * adx;
|
||||
while (++x < x1) {
|
||||
y += base;
|
||||
@@ -195,7 +195,7 @@ static void render_line(int x0, int y0, int x1, int y1, float *buf)
|
||||
err -= adx;
|
||||
y += sy;
|
||||
}
|
||||
buf[x] = ff_vorbis_floor1_inverse_db_table[y];
|
||||
buf[x] = ff_vorbis_floor1_inverse_db_table[av_clip_uint8(y)];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+38
-15
@@ -660,7 +660,7 @@ static int vorbis_parse_setup_hdr_residues(vorbis_context *vc)
|
||||
res_setup->partition_size = get_bits(gb, 24) + 1;
|
||||
/* Validations to prevent a buffer overflow later. */
|
||||
if (res_setup->begin>res_setup->end ||
|
||||
res_setup->end > vc->avccontext->channels * vc->blocksize[1] / 2 ||
|
||||
res_setup->end > (res_setup->type == 2 ? vc->avccontext->channels : 1) * vc->blocksize[1] / 2 ||
|
||||
(res_setup->end-res_setup->begin) / res_setup->partition_size > V_MAX_PARTITIONS) {
|
||||
av_log(vc->avccontext, AV_LOG_ERROR,
|
||||
"partition out of bounds: type, begin, end, size, blocksize: %"PRIu16", %"PRIu32", %"PRIu32", %u, %"PRIu32"\n",
|
||||
@@ -1232,20 +1232,20 @@ static int vorbis_floor1_decode(vorbis_context *vc,
|
||||
floor1_flag[i] = 1;
|
||||
if (val >= room) {
|
||||
if (highroom > lowroom) {
|
||||
floor1_Y_final[i] = val - lowroom + predicted;
|
||||
floor1_Y_final[i] = av_clip_uint16(val - lowroom + predicted);
|
||||
} else {
|
||||
floor1_Y_final[i] = predicted - val + highroom - 1;
|
||||
floor1_Y_final[i] = av_clip_uint16(predicted - val + highroom - 1);
|
||||
}
|
||||
} else {
|
||||
if (val & 1) {
|
||||
floor1_Y_final[i] = predicted - (val + 1) / 2;
|
||||
floor1_Y_final[i] = av_clip_uint16(predicted - (val + 1) / 2);
|
||||
} else {
|
||||
floor1_Y_final[i] = predicted + val / 2;
|
||||
floor1_Y_final[i] = av_clip_uint16(predicted + val / 2);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
floor1_flag[i] = 0;
|
||||
floor1_Y_final[i] = predicted;
|
||||
floor1_Y_final[i] = av_clip_uint16(predicted);
|
||||
}
|
||||
|
||||
av_dlog(NULL, " Decoded floor(%d) = %u / val %u\n",
|
||||
@@ -1269,6 +1269,7 @@ static av_always_inline int vorbis_residue_decode_internal(vorbis_context *vc,
|
||||
uint8_t *do_not_decode,
|
||||
float *vec,
|
||||
unsigned vlen,
|
||||
unsigned ch_left,
|
||||
int vr_type)
|
||||
{
|
||||
GetBitContext *gb = &vc->gb;
|
||||
@@ -1276,6 +1277,7 @@ static av_always_inline int vorbis_residue_decode_internal(vorbis_context *vc,
|
||||
unsigned ptns_to_read = vr->ptns_to_read;
|
||||
uint8_t *classifs = vr->classifs;
|
||||
unsigned pass, ch_used, i, j, k, l;
|
||||
unsigned max_output = (ch - 1) * vlen;
|
||||
|
||||
if (vr_type == 2) {
|
||||
for (j = 1; j < ch; ++j)
|
||||
@@ -1283,8 +1285,15 @@ static av_always_inline int vorbis_residue_decode_internal(vorbis_context *vc,
|
||||
if (do_not_decode[0])
|
||||
return 0;
|
||||
ch_used = 1;
|
||||
max_output += vr->end / ch;
|
||||
} else {
|
||||
ch_used = ch;
|
||||
max_output += vr->end;
|
||||
}
|
||||
|
||||
if (max_output > ch_left * vlen) {
|
||||
av_log(vc->avccontext, AV_LOG_ERROR, "Insufficient output buffer\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
av_dlog(NULL, " residue type 0/1/2 decode begin, ch: %d cpc %d \n", ch, c_p_c);
|
||||
@@ -1411,14 +1420,15 @@ static av_always_inline int vorbis_residue_decode_internal(vorbis_context *vc,
|
||||
static inline int vorbis_residue_decode(vorbis_context *vc, vorbis_residue *vr,
|
||||
unsigned ch,
|
||||
uint8_t *do_not_decode,
|
||||
float *vec, unsigned vlen)
|
||||
float *vec, unsigned vlen,
|
||||
unsigned ch_left)
|
||||
{
|
||||
if (vr->type == 2)
|
||||
return vorbis_residue_decode_internal(vc, vr, ch, do_not_decode, vec, vlen, 2);
|
||||
return vorbis_residue_decode_internal(vc, vr, ch, do_not_decode, vec, vlen, ch_left, 2);
|
||||
else if (vr->type == 1)
|
||||
return vorbis_residue_decode_internal(vc, vr, ch, do_not_decode, vec, vlen, 1);
|
||||
return vorbis_residue_decode_internal(vc, vr, ch, do_not_decode, vec, vlen, ch_left, 1);
|
||||
else if (vr->type == 0)
|
||||
return vorbis_residue_decode_internal(vc, vr, ch, do_not_decode, vec, vlen, 0);
|
||||
return vorbis_residue_decode_internal(vc, vr, ch, do_not_decode, vec, vlen, ch_left, 0);
|
||||
else {
|
||||
av_log(vc->avccontext, AV_LOG_ERROR, " Invalid residue type while residue decode?! \n");
|
||||
return -1;
|
||||
@@ -1466,6 +1476,8 @@ static int vorbis_parse_audio_packet(vorbis_context *vc)
|
||||
uint8_t res_chan[255];
|
||||
unsigned res_num = 0;
|
||||
int retlen = 0;
|
||||
unsigned ch_left = vc->audio_channels;
|
||||
unsigned vlen;
|
||||
|
||||
if (get_bits1(gb)) {
|
||||
av_log(vc->avccontext, AV_LOG_ERROR, "Not a Vorbis I audio packet.\n");
|
||||
@@ -1485,11 +1497,12 @@ static int vorbis_parse_audio_packet(vorbis_context *vc)
|
||||
|
||||
blockflag = vc->modes[mode_number].blockflag;
|
||||
blocksize = vc->blocksize[blockflag];
|
||||
vlen = blocksize / 2;
|
||||
if (blockflag)
|
||||
skip_bits(gb, 2); // previous_window, next_window
|
||||
|
||||
memset(ch_res_ptr, 0, sizeof(float) * vc->audio_channels * blocksize / 2); //FIXME can this be removed ?
|
||||
memset(ch_floor_ptr, 0, sizeof(float) * vc->audio_channels * blocksize / 2); //FIXME can this be removed ?
|
||||
memset(ch_res_ptr, 0, sizeof(float) * vc->audio_channels * vlen); //FIXME can this be removed ?
|
||||
memset(ch_floor_ptr, 0, sizeof(float) * vc->audio_channels * vlen); //FIXME can this be removed ?
|
||||
|
||||
// Decode floor
|
||||
|
||||
@@ -1509,7 +1522,7 @@ static int vorbis_parse_audio_packet(vorbis_context *vc)
|
||||
return -1;
|
||||
}
|
||||
no_residue[i] = ret;
|
||||
ch_floor_ptr += blocksize / 2;
|
||||
ch_floor_ptr += vlen;
|
||||
}
|
||||
|
||||
// Nonzero vector propagate
|
||||
@@ -1526,6 +1539,7 @@ static int vorbis_parse_audio_packet(vorbis_context *vc)
|
||||
for (i = 0; i < mapping->submaps; ++i) {
|
||||
vorbis_residue *residue;
|
||||
unsigned ch = 0;
|
||||
int ret;
|
||||
|
||||
for (j = 0; j < vc->audio_channels; ++j) {
|
||||
if ((mapping->submaps == 1) || (i == mapping->mux[j])) {
|
||||
@@ -1540,9 +1554,18 @@ static int vorbis_parse_audio_packet(vorbis_context *vc)
|
||||
}
|
||||
}
|
||||
residue = &vc->residues[mapping->submap_residue[i]];
|
||||
vorbis_residue_decode(vc, residue, ch, do_not_decode, ch_res_ptr, blocksize/2);
|
||||
if (ch_left < ch) {
|
||||
av_log(vc->avccontext, AV_LOG_ERROR, "Too many channels in vorbis_floor_decode.\n");
|
||||
return -1;
|
||||
}
|
||||
if (ch) {
|
||||
ret = vorbis_residue_decode(vc, residue, ch, do_not_decode, ch_res_ptr, vlen, ch_left);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ch_res_ptr += ch * blocksize / 2;
|
||||
ch_res_ptr += ch * vlen;
|
||||
ch_left -= ch;
|
||||
}
|
||||
|
||||
// Inverse coupling
|
||||
|
||||
@@ -1308,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;
|
||||
@@ -1319,6 +1323,8 @@ static inline int vp3_dequant(Vp3DecodeContext *s, Vp3Fragment *frag,
|
||||
return i;
|
||||
}
|
||||
} while (i < 64);
|
||||
// return value is expected to be a valid level
|
||||
i--;
|
||||
end:
|
||||
// the actual DC+prediction is in the fragment structure
|
||||
block[0] = frag->dc * s->qmat[0][inter][plane][0];
|
||||
|
||||
+11
-2
@@ -55,6 +55,11 @@ static int vp5_parse_header(VP56Context *s, const uint8_t *buf, int buf_size,
|
||||
}
|
||||
rows = vp56_rac_gets(c, 8); /* number of stored macroblock rows */
|
||||
cols = vp56_rac_gets(c, 8); /* number of stored macroblock cols */
|
||||
if (!rows || !cols) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "Invalid size %dx%d\n",
|
||||
cols << 4, rows << 4);
|
||||
return 0;
|
||||
}
|
||||
vp56_rac_gets(c, 8); /* number of displayed macroblock rows */
|
||||
vp56_rac_gets(c, 8); /* number of displayed macroblock cols */
|
||||
vp56_rac_gets(c, 2);
|
||||
@@ -183,7 +188,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 +226,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];
|
||||
|
||||
+11
-4
@@ -75,6 +75,10 @@ static int vp6_parse_header(VP56Context *s, const uint8_t *buf, int buf_size,
|
||||
cols = buf[3]; /* number of stored macroblock cols */
|
||||
/* buf[4] is number of displayed macroblock rows */
|
||||
/* buf[5] is number of displayed macroblock cols */
|
||||
if (!rows || !cols) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "Invalid size %dx%d\n", cols << 4, rows << 4);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!s->macroblocks || /* first frame */
|
||||
16*cols != s->avctx->coded_width ||
|
||||
@@ -95,7 +99,7 @@ static int vp6_parse_header(VP56Context *s, const uint8_t *buf, int buf_size,
|
||||
vrt_shift = 5;
|
||||
s->sub_version = sub_version;
|
||||
} else {
|
||||
if (!s->sub_version)
|
||||
if (!s->sub_version || !s->avctx->coded_width || !s->avctx->coded_height)
|
||||
return 0;
|
||||
|
||||
if (separated_coeff || !s->filter_header) {
|
||||
@@ -440,7 +444,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])) {
|
||||
@@ -481,8 +486,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];
|
||||
}
|
||||
|
||||
|
||||
+4
-1
@@ -85,7 +85,7 @@ int av_cold ff_wma_get_frame_len_bits(int sample_rate, int version,
|
||||
} else if (sample_rate <= 22050 ||
|
||||
(sample_rate <= 32000 && version == 1)) {
|
||||
frame_len_bits = 10;
|
||||
} else if (sample_rate <= 48000) {
|
||||
} else if (sample_rate <= 48000 || version < 3) {
|
||||
frame_len_bits = 11;
|
||||
} else if (sample_rate <= 96000) {
|
||||
frame_len_bits = 12;
|
||||
@@ -137,6 +137,9 @@ int ff_wma_init(AVCodecContext *avctx, int flags2)
|
||||
|
||||
/* compute MDCT block size */
|
||||
s->frame_len_bits = ff_wma_get_frame_len_bits(s->sample_rate, s->version, 0);
|
||||
s->next_block_len_bits = s->frame_len_bits;
|
||||
s->prev_block_len_bits = s->frame_len_bits;
|
||||
s->block_len_bits = s->frame_len_bits;
|
||||
|
||||
s->frame_len = 1 << s->frame_len_bits;
|
||||
if (s->use_variable_block_len) {
|
||||
|
||||
+8
-1
@@ -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;
|
||||
|
||||
@@ -359,7 +364,7 @@ static int decode_exp_vlc(WMACodecContext *s, int ch)
|
||||
}
|
||||
/* NOTE: this offset is the same as MPEG4 AAC ! */
|
||||
last_exp += code - 60;
|
||||
if ((unsigned)last_exp + 60 > FF_ARRAY_ELEMS(pow_tab)) {
|
||||
if ((unsigned)last_exp + 60 >= FF_ARRAY_ELEMS(pow_tab)) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "Exponent out of range: %d\n",
|
||||
last_exp);
|
||||
return -1;
|
||||
@@ -877,6 +882,8 @@ static int wma_decode_superframe(AVCodecContext *avctx,
|
||||
|
||||
/* read each frame starting from bit_offset */
|
||||
pos = bit_offset + 4 + 4 + s->byte_offset_bits + 3;
|
||||
if (pos >= MAX_CODED_SUPERFRAME_SIZE * 8)
|
||||
return AVERROR_INVALIDDATA;
|
||||
init_get_bits(&s->gb, buf + (pos >> 3), (MAX_CODED_SUPERFRAME_SIZE - (pos >> 3))*8);
|
||||
len = pos & 7;
|
||||
if (len > 0)
|
||||
|
||||
+20
-3
@@ -39,6 +39,12 @@ static int encode_init(AVCodecContext * avctx){
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
if (avctx->sample_rate > 48000) {
|
||||
av_log(avctx, AV_LOG_ERROR, "sample rate is too high: %d > 48kHz",
|
||||
avctx->sample_rate);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
if(avctx->bit_rate < 24*1000) {
|
||||
av_log(avctx, AV_LOG_ERROR, "bitrate too low: got %i, need 24000 or higher\n",
|
||||
avctx->bit_rate);
|
||||
@@ -64,6 +70,8 @@ static int encode_init(AVCodecContext * avctx){
|
||||
s->use_exp_vlc = flags2 & 0x0001;
|
||||
s->use_bit_reservoir = flags2 & 0x0002;
|
||||
s->use_variable_block_len = flags2 & 0x0004;
|
||||
if (avctx->channels == 2)
|
||||
s->ms_stereo = 1;
|
||||
|
||||
ff_wma_init(avctx, flags2);
|
||||
|
||||
@@ -71,8 +79,12 @@ static int encode_init(AVCodecContext * avctx){
|
||||
for(i = 0; i < s->nb_block_sizes; i++)
|
||||
ff_mdct_init(&s->mdct_ctx[i], s->frame_len_bits - i + 1, 0, 1.0);
|
||||
|
||||
avctx->block_align=
|
||||
s->block_align= avctx->bit_rate*(int64_t)s->frame_len / (avctx->sample_rate*8);
|
||||
s->block_align = avctx->bit_rate * (int64_t)s->frame_len /
|
||||
(avctx->sample_rate * 8);
|
||||
s->block_align = FFMIN(s->block_align, MAX_CODED_SUPERFRAME_SIZE);
|
||||
avctx->block_align = s->block_align;
|
||||
avctx->bit_rate = avctx->block_align * 8LL * avctx->sample_rate /
|
||||
s->frame_len;
|
||||
//av_log(NULL, AV_LOG_ERROR, "%d %d %d %d\n", s->block_align, avctx->bit_rate, s->frame_len, avctx->sample_rate);
|
||||
avctx->frame_size= s->frame_len;
|
||||
|
||||
@@ -181,7 +193,7 @@ static int encode_block(WMACodecContext *s, float (*src_coefs)[BLOCK_MAX_SIZE],
|
||||
}
|
||||
|
||||
if (s->nb_channels == 2) {
|
||||
put_bits(&s->pb, 1, s->ms_stereo= 1);
|
||||
put_bits(&s->pb, 1, !!s->ms_stereo);
|
||||
}
|
||||
|
||||
for(ch = 0; ch < s->nb_channels; ch++) {
|
||||
@@ -355,6 +367,11 @@ static int encode_superframe(AVCodecContext *avctx,
|
||||
}
|
||||
}
|
||||
|
||||
if (buf_size < 2 * MAX_CODED_SUPERFRAME_SIZE) {
|
||||
av_log(avctx, AV_LOG_ERROR, "output buffer size is too small\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
#if 1
|
||||
total_gain= 128;
|
||||
for(i=64; i; i>>=1){
|
||||
|
||||
@@ -100,8 +100,8 @@ static int ws_snd_decode_frame(AVCodecContext *avctx,
|
||||
|
||||
/* make sure we don't write more than out_size samples */
|
||||
switch (code) {
|
||||
case 0: smp = 4; break;
|
||||
case 1: smp = 2; break;
|
||||
case 0: smp = 4*(count+1); break;
|
||||
case 1: smp = 2*(count+1); break;
|
||||
case 2: smp = (count & 0x20) ? 1 : count + 1; break;
|
||||
default: smp = count + 1; break;
|
||||
}
|
||||
|
||||
@@ -474,7 +474,7 @@ cglobal scalarproduct_float_sse, 3,3,2, v1, v2, offset
|
||||
shufps xmm0, xmm0, 1
|
||||
addss xmm0, xmm1
|
||||
%ifndef ARCH_X86_64
|
||||
movd r0m, xmm0
|
||||
movss r0m, xmm0
|
||||
fld dword r0m
|
||||
%endif
|
||||
RET
|
||||
|
||||
@@ -823,6 +823,7 @@ static int vsad16_mmx2(void *v, uint8_t * pix1, uint8_t * pix2, int line_size, i
|
||||
|
||||
static void diff_bytes_mmx(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w){
|
||||
x86_reg i=0;
|
||||
if(w>=16)
|
||||
__asm__ volatile(
|
||||
"1: \n\t"
|
||||
"movq (%2, %0), %%mm0 \n\t"
|
||||
|
||||
@@ -876,7 +876,7 @@ cglobal deblock_v_chroma_10_%1, 5,7-(mmsize/16),8*(mmsize/16)
|
||||
%if mmsize < 16
|
||||
add r0, mmsize
|
||||
add r5, mmsize
|
||||
add r4, mmsize/8
|
||||
add r4, mmsize/4
|
||||
dec r6
|
||||
jg .loop
|
||||
REP_RET
|
||||
|
||||
+3
-1
@@ -555,8 +555,10 @@ static int xan_decode_frame(AVCodecContext *avctx,
|
||||
}
|
||||
buf_size = buf_end - buf;
|
||||
}
|
||||
if (s->palettes_count <= 0)
|
||||
if (s->palettes_count <= 0) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "No palette found\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
if ((ret = avctx->get_buffer(avctx, &s->current_frame))) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
|
||||
@@ -614,7 +614,7 @@ void avfilter_filter_samples(AVFilterLink *link, AVFilterBufferRef *samplesref)
|
||||
link->cur_buf->audio->sample_rate = samplesref->audio->sample_rate;
|
||||
|
||||
/* Copy actual data into new samples buffer */
|
||||
for (i = 0; samplesref->data[i]; i++)
|
||||
for (i = 0; samplesref->data[i] && i < 8; i++)
|
||||
memcpy(link->cur_buf->data[i], samplesref->data[i], samplesref->linesize[0]);
|
||||
|
||||
avfilter_unref_buffer(samplesref);
|
||||
|
||||
@@ -157,7 +157,7 @@ static int config_input(AVFilterLink *inlink)
|
||||
var_values[VAR_OUT_H] = var_values[VAR_OH] = NAN;
|
||||
var_values[VAR_A] = (float) inlink->w / inlink->h;
|
||||
var_values[VAR_HSUB] = 1<<pad->hsub;
|
||||
var_values[VAR_VSUB] = 2<<pad->vsub;
|
||||
var_values[VAR_VSUB] = 1<<pad->vsub;
|
||||
|
||||
/* evaluate width and height */
|
||||
av_expr_parse_and_eval(&res, (expr = pad->w_expr),
|
||||
|
||||
@@ -232,9 +232,11 @@ static int config_props(AVFilterLink *outlink)
|
||||
if (!scale->sws || !scale->isws[0] || !scale->isws[1])
|
||||
return AVERROR(EINVAL);
|
||||
|
||||
if (inlink->sample_aspect_ratio.num){
|
||||
outlink->sample_aspect_ratio = av_mul_q((AVRational){outlink->h * inlink->w, outlink->w * inlink->h}, inlink->sample_aspect_ratio);
|
||||
} else
|
||||
if (inlink->sample_aspect_ratio.num)
|
||||
outlink->sample_aspect_ratio = av_mul_q((AVRational){outlink->h*inlink->w,
|
||||
outlink->w*inlink->h},
|
||||
inlink->sample_aspect_ratio);
|
||||
else
|
||||
outlink->sample_aspect_ratio = inlink->sample_aspect_ratio;
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -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}},
|
||||
|
||||
@@ -36,8 +36,8 @@ typedef struct {
|
||||
int mode;
|
||||
|
||||
/**
|
||||
* 0: bottom field first
|
||||
* 1: top field first
|
||||
* 0: top field first
|
||||
* 1: bottom field first
|
||||
* -1: auto-detection
|
||||
*/
|
||||
int parity;
|
||||
@@ -195,9 +195,12 @@ static void return_frame(AVFilterContext *ctx, int is_second)
|
||||
tff = yadif->parity^1;
|
||||
}
|
||||
|
||||
if (is_second)
|
||||
if (is_second) {
|
||||
yadif->out = avfilter_get_video_buffer(link, AV_PERM_WRITE | AV_PERM_PRESERVE |
|
||||
AV_PERM_REUSE, link->w, link->h);
|
||||
avfilter_copy_buffer_ref_props(yadif->out, yadif->cur);
|
||||
yadif->out->video->interlaced = 0;
|
||||
}
|
||||
|
||||
if (!yadif->csp)
|
||||
yadif->csp = &av_pix_fmt_descriptors[link->format];
|
||||
|
||||
+1
-1
@@ -176,7 +176,7 @@ static int fourxm_read_header(AVFormatContext *s,
|
||||
sizeof(AudioTrack),
|
||||
current_track + 1);
|
||||
if (!fourxm->tracks) {
|
||||
ret= AVERROR(ENOMEM);
|
||||
ret = AVERROR(ENOMEM);
|
||||
goto fail;
|
||||
}
|
||||
memset(&fourxm->tracks[fourxm->track_count], 0,
|
||||
|
||||
@@ -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;
|
||||
|
||||
+13
-2
@@ -196,6 +196,8 @@ static int asf_read_file_properties(AVFormatContext *s, int64_t size)
|
||||
asf->hdr.flags = avio_rl32(pb);
|
||||
asf->hdr.min_pktsize = avio_rl32(pb);
|
||||
asf->hdr.max_pktsize = avio_rl32(pb);
|
||||
if (asf->hdr.min_pktsize >= (1U<<29))
|
||||
return AVERROR_INVALIDDATA;
|
||||
asf->hdr.max_bitrate = avio_rl32(pb);
|
||||
s->packet_size = asf->hdr.max_pktsize;
|
||||
|
||||
@@ -609,7 +611,9 @@ static int asf_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
||||
if (gsize < 24)
|
||||
return -1;
|
||||
if (!ff_guidcmp(&g, &ff_asf_file_header)) {
|
||||
asf_read_file_properties(s, gsize);
|
||||
int ret = asf_read_file_properties(s, gsize);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
} else if (!ff_guidcmp(&g, &ff_asf_stream_header)) {
|
||||
asf_read_stream_properties(s, gsize);
|
||||
} else if (!ff_guidcmp(&g, &ff_asf_comment_header)) {
|
||||
@@ -750,7 +754,7 @@ static int ff_asf_get_packet(AVFormatContext *s, AVIOContext *pb)
|
||||
c= avio_r8(pb);
|
||||
d= avio_r8(pb);
|
||||
rsize+=3;
|
||||
}else{
|
||||
} else if (!pb->eof_reached) {
|
||||
avio_seek(pb, -1, SEEK_CUR); //FIXME
|
||||
}
|
||||
|
||||
@@ -782,6 +786,13 @@ static int ff_asf_get_packet(AVFormatContext *s, AVIOContext *pb)
|
||||
asf->packet_segments = 1;
|
||||
asf->packet_segsizetype = 0x80;
|
||||
}
|
||||
if (rsize > packet_length - padsize) {
|
||||
asf->packet_size_left = 0;
|
||||
av_log(s, AV_LOG_ERROR,
|
||||
"invalid packet header length %d for pktlen %d-%d at %"PRId64"\n",
|
||||
rsize, packet_length, padsize, avio_tell(pb));
|
||||
return -1;
|
||||
}
|
||||
asf->packet_size_left = packet_length - padsize - rsize;
|
||||
if (packet_length < asf->hdr.min_pktsize)
|
||||
padsize += asf->hdr.min_pktsize - packet_length;
|
||||
|
||||
@@ -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.
|
||||
|
||||
+22
-7
@@ -119,16 +119,23 @@ static int dv_extract_audio(uint8_t* frame, uint8_t* ppcm[4],
|
||||
if (quant > 1)
|
||||
return -1; /* unsupported quantization */
|
||||
|
||||
if (freq >= FF_ARRAY_ELEMS(dv_audio_frequency))
|
||||
return AVERROR_INVALIDDATA;
|
||||
|
||||
size = (sys->audio_min_samples[freq] + smpls) * 4; /* 2ch, 2bytes */
|
||||
half_ch = sys->difseg_size / 2;
|
||||
|
||||
/* We work with 720p frames split in half, thus even frames have
|
||||
* channels 0,1 and odd 2,3. */
|
||||
ipcm = (sys->height == 720 && !(frame[1] & 0x0C)) ? 2 : 0;
|
||||
pcm = ppcm[ipcm++];
|
||||
|
||||
/* for each DIF channel */
|
||||
for (chan = 0; chan < sys->n_difchan; chan++) {
|
||||
/* next stereo channel (50Mbps and 100Mbps only) */
|
||||
pcm = ppcm[ipcm++];
|
||||
if (!pcm)
|
||||
break;
|
||||
|
||||
/* for each DIF segment */
|
||||
for (i = 0; i < sys->difseg_size; i++) {
|
||||
frame += 6 * 80; /* skip DIF segment header */
|
||||
@@ -176,11 +183,6 @@ static int dv_extract_audio(uint8_t* frame, uint8_t* ppcm[4],
|
||||
frame += 16 * 80; /* 15 Video DIFs + 1 Audio DIF */
|
||||
}
|
||||
}
|
||||
|
||||
/* next stereo channel (50Mbps and 100Mbps only) */
|
||||
pcm = ppcm[ipcm++];
|
||||
if (!pcm)
|
||||
break;
|
||||
}
|
||||
|
||||
return size;
|
||||
@@ -202,6 +204,18 @@ static int dv_extract_audio_info(DVDemuxContext* c, uint8_t* frame)
|
||||
stype = (as_pack[3] & 0x1f); /* 0 - 2CH, 2 - 4CH, 3 - 8CH */
|
||||
quant = as_pack[4] & 0x07; /* 0 - 16bit linear, 1 - 12bit nonlinear */
|
||||
|
||||
if (freq >= FF_ARRAY_ELEMS(dv_audio_frequency)) {
|
||||
av_log(c->fctx, AV_LOG_ERROR,
|
||||
"Unrecognized audio sample rate index (%d)\n", freq);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (stype > 3) {
|
||||
av_log(c->fctx, AV_LOG_ERROR, "stype %d is invalid\n", stype);
|
||||
c->ach = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* note: ach counts PAIRS of channels (i.e. stereo channels) */
|
||||
ach = ((int[4]){ 1, 0, 2, 4})[stype];
|
||||
if (ach == 1 && quant && freq == 2)
|
||||
@@ -336,7 +350,8 @@ int dv_produce_packet(DVDemuxContext *c, AVPacket *pkt,
|
||||
c->audio_pkt[i].pts = c->abytes * 30000*8 / c->ast[i]->codec->bit_rate;
|
||||
ppcm[i] = c->audio_buf[i];
|
||||
}
|
||||
dv_extract_audio(buf, ppcm, c->sys);
|
||||
if (c->ach)
|
||||
dv_extract_audio(buf, ppcm, c->sys);
|
||||
|
||||
/* We work with 720p frames split in half, thus even frames have
|
||||
* channels 0,1 and odd 2,3. */
|
||||
|
||||
@@ -173,8 +173,8 @@ static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, AVStream
|
||||
}
|
||||
}
|
||||
|
||||
if (timeslen == fileposlen) {
|
||||
for(i = 0; i < timeslen; i++)
|
||||
if (!ret && timeslen == fileposlen) {
|
||||
for (i = 0; i < fileposlen; i++)
|
||||
av_add_index_entry(vstream, filepositions[i], times[i]*1000, 0, 0, AVINDEX_KEYFRAME);
|
||||
} else
|
||||
av_log(s, AV_LOG_WARNING, "Invalid keyframes object, skipping.\n");
|
||||
@@ -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");
|
||||
|
||||
|
||||
+11
-2
@@ -224,8 +224,17 @@ static void ff_id3v2_parse(AVFormatContext *s, int len, uint8_t version, uint8_t
|
||||
|
||||
unsync = flags & 0x80;
|
||||
|
||||
if (isv34 && flags & 0x40) /* Extended header present, just skip over it */
|
||||
avio_skip(s->pb, get_size(s->pb, 4));
|
||||
if (isv34 && flags & 0x40) { /* Extended header present, just skip over it */
|
||||
int extlen = get_size(s->pb, 4);
|
||||
if (version == 4)
|
||||
extlen -= 4; // in v2.4 the length includes the length field we just read
|
||||
|
||||
if (extlen < 0) {
|
||||
reason = "invalid extended header length";
|
||||
goto error;
|
||||
}
|
||||
avio_skip(s->pb, extlen);
|
||||
}
|
||||
|
||||
while (len >= taghdrlen) {
|
||||
unsigned int tflags = 0;
|
||||
|
||||
+6
-1
@@ -149,10 +149,13 @@ const AVCodecTag codec_movvideo_tags[] = {
|
||||
{ CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '1') }, /* MPEG2 HDV 720p30 */
|
||||
{ CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '2') }, /* MPEG2 HDV 1080i60 */
|
||||
{ CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '3') }, /* MPEG2 HDV 1080i50 */
|
||||
{ CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '4') }, /* MPEG2 HDV 720p24 */
|
||||
{ CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '5') }, /* MPEG2 HDV 720p25 */
|
||||
{ CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '6') }, /* MPEG2 HDV 1080p24 */
|
||||
{ CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '7') }, /* MPEG2 HDV 1080p25 */
|
||||
{ CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '8') }, /* MPEG2 HDV 1080p30 */
|
||||
{ CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '9') }, /* MPEG2 HDV 720p60 JVC */
|
||||
{ CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', 'a') }, /* MPEG2 HDV 720p50 */
|
||||
{ CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '5', 'n') }, /* MPEG2 IMX NTSC 525/60 50mb/s produced by FCP */
|
||||
{ CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '5', 'p') }, /* MPEG2 IMX PAL 625/50 50mb/s produced by FCP */
|
||||
{ CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '4', 'n') }, /* MPEG2 IMX NTSC 525/60 40mb/s produced by FCP */
|
||||
@@ -183,6 +186,8 @@ const AVCodecTag codec_movvideo_tags[] = {
|
||||
{ CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'd') }, /* XDCAM EX 1080p24 VBR */
|
||||
{ CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'e') }, /* XDCAM EX 1080p25 VBR */
|
||||
{ CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'f') }, /* XDCAM EX 1080p30 VBR */
|
||||
{ CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'h', 'd') }, /* XDCAM HD 540p */
|
||||
{ CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'h', '2') }, /* XDCAM HD422 540p */
|
||||
{ CODEC_ID_MPEG2VIDEO, MKTAG('A', 'V', 'm', 'p') }, /* AVID IMX PAL */
|
||||
|
||||
{ CODEC_ID_JPEG2000, MKTAG('m', 'j', 'p', '2') }, /* JPEG 2000 produced by FCP */
|
||||
@@ -397,7 +402,7 @@ int ff_mp4_read_dec_config_descr(AVFormatContext *fc, AVStream *st, AVIOContext
|
||||
len = ff_mp4_read_descr(fc, pb, &tag);
|
||||
if (tag == MP4DecSpecificDescrTag) {
|
||||
av_dlog(fc, "Specific MPEG4 header len=%d\n", len);
|
||||
if((uint64_t)len > (1<<30))
|
||||
if (!len || (uint64_t)len > (1<<30))
|
||||
return -1;
|
||||
av_free(st->codec->extradata);
|
||||
st->codec->extradata = av_mallocz(len + FF_INPUT_BUFFER_PADDING_SIZE);
|
||||
|
||||
+29
-10
@@ -664,16 +664,19 @@ static int ebml_read_float(AVIOContext *pb, int size, double *num)
|
||||
*/
|
||||
static int ebml_read_ascii(AVIOContext *pb, int size, char **str)
|
||||
{
|
||||
av_free(*str);
|
||||
char *res;
|
||||
|
||||
/* EBML strings are usually not 0-terminated, so we allocate one
|
||||
* byte more, read the string and NULL-terminate it ourselves. */
|
||||
if (!(*str = av_malloc(size + 1)))
|
||||
if (!(res = av_malloc(size + 1)))
|
||||
return AVERROR(ENOMEM);
|
||||
if (avio_read(pb, (uint8_t *) *str, size) != size) {
|
||||
av_freep(str);
|
||||
if (avio_read(pb, (uint8_t *) res, size) != size) {
|
||||
av_free(res);
|
||||
return AVERROR(EIO);
|
||||
}
|
||||
(*str)[size] = '\0';
|
||||
(res)[size] = '\0';
|
||||
av_free(*str);
|
||||
*str = res;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1169,7 +1172,6 @@ static void matroska_convert_tags(AVFormatContext *s)
|
||||
static void matroska_execute_seekhead(MatroskaDemuxContext *matroska)
|
||||
{
|
||||
EbmlList *seekhead_list = &matroska->seekhead;
|
||||
MatroskaSeekhead *seekhead = seekhead_list->elem;
|
||||
uint32_t level_up = matroska->level_up;
|
||||
int64_t before_pos = avio_tell(matroska->ctx->pb);
|
||||
uint32_t saved_id = matroska->current_id;
|
||||
@@ -1182,6 +1184,7 @@ static void matroska_execute_seekhead(MatroskaDemuxContext *matroska)
|
||||
return;
|
||||
|
||||
for (i=0; i<seekhead_list->nb_elem; i++) {
|
||||
MatroskaSeekhead *seekhead = seekhead_list->elem;
|
||||
int64_t offset = seekhead[i].pos + matroska->segment_start;
|
||||
|
||||
if (seekhead[i].pos <= before_pos
|
||||
@@ -1427,7 +1430,7 @@ static int matroska_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
||||
} else if (codec_id == CODEC_ID_AAC && !track->codec_priv.size) {
|
||||
int profile = matroska_aac_profile(track->codec_id);
|
||||
int sri = matroska_aac_sri(track->audio.samplerate);
|
||||
extradata = av_malloc(5);
|
||||
extradata = av_mallocz(5 + FF_INPUT_BUFFER_PADDING_SIZE);
|
||||
if (extradata == NULL)
|
||||
return AVERROR(ENOMEM);
|
||||
extradata[0] = (profile << 3) | ((sri&0x0E) >> 1);
|
||||
@@ -1836,15 +1839,31 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data,
|
||||
if (!track->audio.pkt_cnt) {
|
||||
if (track->audio.sub_packet_cnt == 0)
|
||||
track->audio.buf_timecode = timecode;
|
||||
if (st->codec->codec_id == CODEC_ID_RA_288)
|
||||
if (st->codec->codec_id == CODEC_ID_RA_288) {
|
||||
if (size < cfs * h / 2) {
|
||||
av_log(matroska->ctx, AV_LOG_ERROR,
|
||||
"Corrupt int4 RM-style audio packet size\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
for (x=0; x<h/2; x++)
|
||||
memcpy(track->audio.buf+x*2*w+y*cfs,
|
||||
data+x*cfs, cfs);
|
||||
else if (st->codec->codec_id == CODEC_ID_SIPR)
|
||||
} else if (st->codec->codec_id == CODEC_ID_SIPR) {
|
||||
if (size < w) {
|
||||
av_log(matroska->ctx, AV_LOG_ERROR,
|
||||
"Corrupt sipr RM-style audio packet size\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
memcpy(track->audio.buf + y*w, data, w);
|
||||
else
|
||||
} else {
|
||||
if (size < sps * w / sps) {
|
||||
av_log(matroska->ctx, AV_LOG_ERROR,
|
||||
"Corrupt generic RM-style audio packet size\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
for (x=0; x<w/sps; x++)
|
||||
memcpy(track->audio.buf+sps*(h*x+((h+1)/2)*(y&1)+(y>>1)), data+x*sps, sps);
|
||||
}
|
||||
|
||||
if (++track->audio.sub_packet_cnt >= h) {
|
||||
if (st->codec->codec_id == CODEC_ID_SIPR)
|
||||
|
||||
+3
-4
@@ -423,7 +423,7 @@ static int mpegps_read_packet(AVFormatContext *s,
|
||||
{
|
||||
MpegDemuxContext *m = s->priv_data;
|
||||
AVStream *st;
|
||||
int len, startcode, i, es_type;
|
||||
int len, startcode, i, es_type, ret;
|
||||
int request_probe= 0;
|
||||
enum CodecID codec_id = CODEC_ID_NONE;
|
||||
enum AVMediaType type;
|
||||
@@ -568,8 +568,7 @@ static int mpegps_read_packet(AVFormatContext *s,
|
||||
else if (st->codec->bits_per_coded_sample == 28)
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
av_new_packet(pkt, len);
|
||||
avio_read(s->pb, pkt->data, pkt->size);
|
||||
ret = av_get_packet(s->pb, pkt, len);
|
||||
pkt->pts = pts;
|
||||
pkt->dts = dts;
|
||||
pkt->pos = dummy_pos;
|
||||
@@ -578,7 +577,7 @@ static int mpegps_read_packet(AVFormatContext *s,
|
||||
pkt->stream_index, pkt->pts / 90000.0, pkt->dts / 90000.0,
|
||||
pkt->size);
|
||||
|
||||
return 0;
|
||||
return (ret < 0) ? ret : 0;
|
||||
}
|
||||
|
||||
static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index,
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include "libavutil/crc.h"
|
||||
#include "libavutil/dict.h"
|
||||
#include "libavutil/opt.h"
|
||||
#include "libavutil/avassert.h"
|
||||
#include "libavcodec/mpegvideo.h"
|
||||
#include "avformat.h"
|
||||
#include "internal.h"
|
||||
@@ -947,19 +948,20 @@ static int mpegts_write_packet(AVFormatContext *s, AVPacket *pkt)
|
||||
}
|
||||
}
|
||||
|
||||
if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
|
||||
if (ts_st->payload_index && ts_st->payload_index + size > DEFAULT_PES_PAYLOAD_SIZE) {
|
||||
mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_index,
|
||||
ts_st->payload_pts, ts_st->payload_dts);
|
||||
ts_st->payload_index = 0;
|
||||
}
|
||||
|
||||
if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO || size > DEFAULT_PES_PAYLOAD_SIZE) {
|
||||
av_assert0(!ts_st->payload_index);
|
||||
// for video and subtitle, write a single pes packet
|
||||
mpegts_write_pes(s, st, buf, size, pts, dts);
|
||||
av_free(data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ts_st->payload_index + size > DEFAULT_PES_PAYLOAD_SIZE) {
|
||||
mpegts_write_pes(s, st, ts_st->payload, ts_st->payload_index,
|
||||
ts_st->payload_pts, ts_st->payload_dts);
|
||||
ts_st->payload_index = 0;
|
||||
}
|
||||
|
||||
if (!ts_st->payload_index) {
|
||||
ts_st->payload_pts = pts;
|
||||
ts_st->payload_dts = dts;
|
||||
|
||||
+17
-6
@@ -308,7 +308,9 @@ static int nsv_parse_NSVf_header(AVFormatContext *s, AVFormatParameters *ap)
|
||||
char *token, *value;
|
||||
char quote;
|
||||
|
||||
p = strings = av_mallocz(strings_size + 1);
|
||||
p = strings = av_mallocz((size_t)strings_size + 1);
|
||||
if (!p)
|
||||
return AVERROR(ENOMEM);
|
||||
endp = strings + strings_size;
|
||||
avio_read(pb, strings, strings_size);
|
||||
while (p < endp) {
|
||||
@@ -343,6 +345,8 @@ static int nsv_parse_NSVf_header(AVFormatContext *s, AVFormatParameters *ap)
|
||||
if((unsigned)table_entries_used >= UINT_MAX / sizeof(uint32_t))
|
||||
return -1;
|
||||
nsv->nsvs_file_offset = av_malloc((unsigned)table_entries_used * sizeof(uint32_t));
|
||||
if (!nsv->nsvs_file_offset)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
for(i=0;i<table_entries_used;i++)
|
||||
nsv->nsvs_file_offset[i] = avio_rl32(pb) + size;
|
||||
@@ -350,6 +354,8 @@ static int nsv_parse_NSVf_header(AVFormatContext *s, AVFormatParameters *ap)
|
||||
if(table_entries > table_entries_used &&
|
||||
avio_rl32(pb) == MKTAG('T','O','C','2')) {
|
||||
nsv->nsvs_timestamps = av_malloc((unsigned)table_entries_used*sizeof(uint32_t));
|
||||
if (!nsv->nsvs_timestamps)
|
||||
return AVERROR(ENOMEM);
|
||||
for(i=0;i<table_entries_used;i++) {
|
||||
nsv->nsvs_timestamps[i] = avio_rl32(pb);
|
||||
}
|
||||
@@ -518,11 +524,16 @@ static int nsv_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
||||
for (i = 0; i < NSV_MAX_RESYNC_TRIES; i++) {
|
||||
if (nsv_resync(s) < 0)
|
||||
return -1;
|
||||
if (nsv->state == NSV_FOUND_NSVF)
|
||||
if (nsv->state == NSV_FOUND_NSVF) {
|
||||
err = nsv_parse_NSVf_header(s, ap);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
/* we need the first NSVs also... */
|
||||
if (nsv->state == NSV_FOUND_NSVS) {
|
||||
err = nsv_parse_NSVs_header(s, ap);
|
||||
if (err < 0)
|
||||
return err;
|
||||
break; /* we just want the first one */
|
||||
}
|
||||
}
|
||||
@@ -597,12 +608,12 @@ null_chunk_retry:
|
||||
}
|
||||
|
||||
/* map back streams to v,a */
|
||||
if (s->streams[0])
|
||||
if (s->nb_streams > 0)
|
||||
st[s->streams[0]->id] = s->streams[0];
|
||||
if (s->streams[1])
|
||||
if (s->nb_streams > 1)
|
||||
st[s->streams[1]->id] = s->streams[1];
|
||||
|
||||
if (vsize/* && st[NSV_ST_VIDEO]*/) {
|
||||
if (vsize && st[NSV_ST_VIDEO]) {
|
||||
nst = st[NSV_ST_VIDEO]->priv_data;
|
||||
pkt = &nsv->ahead[NSV_ST_VIDEO];
|
||||
av_get_packet(pb, pkt, vsize);
|
||||
@@ -615,7 +626,7 @@ null_chunk_retry:
|
||||
if(st[NSV_ST_VIDEO])
|
||||
((NSVStream*)st[NSV_ST_VIDEO]->priv_data)->frame_offset++;
|
||||
|
||||
if (asize/*st[NSV_ST_AUDIO]*/) {
|
||||
if (asize && st[NSV_ST_AUDIO]) {
|
||||
nst = st[NSV_ST_AUDIO]->priv_data;
|
||||
pkt = &nsv->ahead[NSV_ST_AUDIO];
|
||||
/* read raw audio specific header on the first audio chunk... */
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user