Compare commits
64 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d4b731e271 | |||
| 927e59b74a | |||
| cbe65ccfa0 | |||
| 63637e457c | |||
| ed2572b9c8 | |||
| cf8e004a51 | |||
| a1a14982ec | |||
| 29ef35abff | |||
| 1fd78b9b34 | |||
| 68ed682710 | |||
| 44ce16b7f9 | |||
| d88493c02b | |||
| 87a47c67a6 | |||
| 7e1d9d25fe | |||
| d399f25bd1 | |||
| 7323a8ab29 | |||
| aa20863f44 | |||
| 83269fd13b | |||
| 884cd3caa5 | |||
| cc66247603 | |||
| dc2d3856f3 | |||
| dd36b3a06a | |||
| 14f555683a | |||
| bd6c1d5149 | |||
| 41fc098a86 | |||
| 3442c20c4d | |||
| 7d222736c2 | |||
| d5154c055b | |||
| cd81993070 | |||
| 2481f1320a | |||
| ceeeccc862 | |||
| 07df85b958 | |||
| 7643e8584f | |||
| 533431d5af | |||
| 9519b2560e | |||
| 3e3e095fc9 | |||
| 41f8a8843d | |||
| 64bb329afa | |||
| 3ecbac5664 | |||
| 0e6febff5a | |||
| 3f779aef79 | |||
| 35ef033a19 | |||
| aec21cd840 | |||
| 47e47cfb07 | |||
| 314c425b16 | |||
| 148c4fb8d2 | |||
| c12ee64e80 | |||
| 46cd1699f9 | |||
| 32b95471a8 | |||
| f66bfe71bb | |||
| af1e19b9e4 | |||
| 334901aea0 | |||
| bbe9a4b542 | |||
| a772aaf5dc | |||
| c39e8d05f5 | |||
| a0715c1e89 | |||
| a0ed412f38 | |||
| 2fb7eb05dc | |||
| 8e4f737d2f | |||
| 2d51cb1d0a | |||
| c165bad0c0 | |||
| 16aa8c8146 | |||
| e5be73e178 | |||
| 0e0a413725 |
@@ -1,6 +1,71 @@
|
||||
Entries are sorted chronologically from oldest to youngest within each release,
|
||||
releases are sorted from youngest to oldest.
|
||||
|
||||
version 3.2.4:
|
||||
- avcodec/h264_slice: Clear ref_counts on redundant slices
|
||||
- lavf/mov.c: Avoid heap allocation wrap in mov_read_uuid
|
||||
- lavf/mov.c: Avoid heap allocation wrap in mov_read_hdlr
|
||||
- avcodec/pictordec: Fix logic error
|
||||
- ffserver_config: Setup codecpar in add_codec()
|
||||
- Changelog: fix typos
|
||||
|
||||
version 3.2.3:
|
||||
- avcodec/movtextdec: Fix decode_styl() cleanup
|
||||
- lavf/matroskadec: fix is_keyframe for early Blocks
|
||||
- configure: bump year
|
||||
- avcodec/pngdec: Check trns more completely
|
||||
- avcodec/interplayvideo: Move parameter change check up
|
||||
- avcodec/dca_lbr: Fix off by 1 error in freq check
|
||||
- avcodec/mjpegdec: Check for for the bitstream end in mjpeg_decode_scan_progressive_ac()
|
||||
- pgssubdec: reset rle_data_len/rle_remaining_len on allocation error
|
||||
- swscale: save ebx register when it is not available
|
||||
- avformat/flacdec: Check avio_read result when reading flac block header.
|
||||
- avcodec/utils: correct align value for interplay
|
||||
- avcodec/vp56: Check for the bitstream end, pass error codes on
|
||||
- avcodec/mjpegdec: Check remaining bitstream in ljpeg_decode_yuv_scan()
|
||||
- avcodec/pngdec: Fix off by 1 size in decode_zbuf()
|
||||
- libopenmpt: add missing avio_read return value check
|
||||
- avcodec/bsf: Fix av_bsf_list_free()
|
||||
- avcodec/omx: Do not pass negative value into av_malloc()
|
||||
- avformat/avidec: skip odml master index chunks in avi_sync
|
||||
- avcodec/mjpegdec: Check for rgb before flipping
|
||||
- lavf/utils.c Protect against accessing entries[nb_entries]
|
||||
- avutil/random_seed: Reduce the time needed on systems with very low precision clock()
|
||||
- swscale/swscale: Fix dereference of stride array before null check
|
||||
- avutil/random_seed: Improve get_generic_seed() with higher precision clock()
|
||||
- avformat/mp3dec: fix msan warning when verifying mpa header
|
||||
- avformat/utils: Print verbose error message if stream count exceeds max_streams
|
||||
- avformat/options_table: Set the default maximum number of streams to 1000
|
||||
- lavf/chromaprint: Update for version 1.4
|
||||
- avutil: Add av_image_check_size2()
|
||||
- avformat: Add max_streams option
|
||||
- avcodec/ffv1enc: Allocate smaller packet if the worst case size cannot be allocated
|
||||
- avcodec/mpeg4videodec: Fix undefined shifts in mpeg4_decode_sprite_trajectory()
|
||||
- avformat/oggdec: Skip streams in duration correction that did not had their duration set.
|
||||
- avcodec/ffv1enc: Fix size of first slice
|
||||
- ffplay: fix sws_scale possible out of bounds array access
|
||||
- avfilter/vf_hwupload_cuda: Add min/max limits for the 'device' option
|
||||
|
||||
version 3.2.2:
|
||||
- ffserver: Check chunk size
|
||||
- Avoid using the term "file" and prefer "url" in some docs and comments
|
||||
- avformat/rtmppkt: Check for packet size mismatches
|
||||
- zmqsend: Initialize ret to 0
|
||||
- avcodec/flacdec: Fix undefined shift in decode_subframe()
|
||||
- avcodec/get_bits: Fix get_sbits_long(0)
|
||||
- avformat/ffmdec: Check media type for chunks
|
||||
- avcodec/flacdec: Fix signed integer overflow in decode_subframe_fixed()
|
||||
- avcodec/flacdsp_template: Fix undefined shift in flac_decorrelate_indep_c
|
||||
- avformat/oggparsespeex: Check frames_per_packet and packet_size
|
||||
- avformat/utils: Check start/end before computing duration in update_stream_timings()
|
||||
- avcodec/flac_parser: Update nb_headers_buffered
|
||||
- avformat/idroqdec: Check chunk_size for being too large
|
||||
- avcodec/me_cmp: Fix median_sad size
|
||||
- avformat/utils: Fix type mismatch
|
||||
- configure: check for strtoull on msvc
|
||||
- http: move chunk handling from http_read_stream() to http_buf_read().
|
||||
- http: make length/offset-related variables unsigned
|
||||
|
||||
version 3.2.1:
|
||||
- avcodec/aac_adtstoasc_bsf: validate and forward extradata if the stream is already ASC
|
||||
- mss2: only use error correction for matching block counts
|
||||
|
||||
@@ -6271,6 +6271,7 @@ __declspec($_restrict) void* foo(int);
|
||||
EOF
|
||||
fi
|
||||
check_func strtoll || add_cflags -Dstrtoll=_strtoi64
|
||||
check_func strtoull || add_cflags -Dstrtoull=_strtoui64
|
||||
# the new SSA optimzer in VS2015 U3 is mis-optimizing some parts of the code
|
||||
# this flag should be re-checked on newer compiler releases and put under a
|
||||
# version check once its fixed
|
||||
@@ -6702,7 +6703,7 @@ cat > $TMPH <<EOF
|
||||
#define FFMPEG_CONFIG_H
|
||||
#define FFMPEG_CONFIGURATION "$(c_escape $FFMPEG_CONFIGURATION)"
|
||||
#define FFMPEG_LICENSE "$(c_escape $license)"
|
||||
#define CONFIG_THIS_YEAR 2016
|
||||
#define CONFIG_THIS_YEAR 2017
|
||||
#define FFMPEG_DATADIR "$(eval c_escape $datadir)"
|
||||
#define AVCONV_DATADIR "$(eval c_escape $datadir)"
|
||||
#define CC_IDENT "$(c_escape ${cc_ident:-Unknown compiler})"
|
||||
|
||||
+1
-1
@@ -38,7 +38,7 @@ PROJECT_NAME = FFmpeg
|
||||
# could be handy for archiving the generated documentation or if some version
|
||||
# control system is used.
|
||||
|
||||
PROJECT_NUMBER = 3.2.1
|
||||
PROJECT_NUMBER = 3.2.4
|
||||
|
||||
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
||||
# for a project that appears at the top of each page and should give viewer a
|
||||
|
||||
+9
-9
@@ -12,7 +12,7 @@
|
||||
|
||||
@chapter Synopsis
|
||||
|
||||
ffmpeg [@var{global_options}] @{[@var{input_file_options}] -i @file{input_file}@} ... @{[@var{output_file_options}] @file{output_file}@} ...
|
||||
ffmpeg [@var{global_options}] @{[@var{input_file_options}] -i @file{input_url}@} ... @{[@var{output_file_options}] @file{output_url}@} ...
|
||||
|
||||
@chapter Description
|
||||
@c man begin DESCRIPTION
|
||||
@@ -24,10 +24,10 @@ rates and resize video on the fly with a high quality polyphase filter.
|
||||
@command{ffmpeg} reads from an arbitrary number of input "files" (which can be regular
|
||||
files, pipes, network streams, grabbing devices, etc.), specified by the
|
||||
@code{-i} option, and writes to an arbitrary number of output "files", which are
|
||||
specified by a plain output filename. Anything found on the command line which
|
||||
cannot be interpreted as an option is considered to be an output filename.
|
||||
specified by a plain output url. Anything found on the command line which
|
||||
cannot be interpreted as an option is considered to be an output url.
|
||||
|
||||
Each input or output file can, in principle, contain any number of streams of
|
||||
Each input or output url can, in principle, contain any number of streams of
|
||||
different types (video/audio/subtitle/attachment/data). The allowed number and/or
|
||||
types of streams may be limited by the container format. Selecting which
|
||||
streams from which inputs will go into which output is either done automatically
|
||||
@@ -243,8 +243,8 @@ Force input or output file format. The format is normally auto detected for inpu
|
||||
files and guessed from the file extension for output files, so this option is not
|
||||
needed in most cases.
|
||||
|
||||
@item -i @var{filename} (@emph{input})
|
||||
input file name
|
||||
@item -i @var{url} (@emph{input})
|
||||
input file url
|
||||
|
||||
@item -y (@emph{global})
|
||||
Overwrite output files without asking.
|
||||
@@ -281,7 +281,7 @@ libx264, and the 138th audio, which will be encoded with libvorbis.
|
||||
When used as an input option (before @code{-i}), limit the @var{duration} of
|
||||
data read from the input file.
|
||||
|
||||
When used as an output option (before an output filename), stop writing the
|
||||
When used as an output option (before an output url), stop writing the
|
||||
output after its duration reaches @var{duration}.
|
||||
|
||||
@var{duration} must be a time duration specification,
|
||||
@@ -310,7 +310,7 @@ extra segment between the seek point and @var{position} will be decoded and
|
||||
discarded. When doing stream copy or when @option{-noaccurate_seek} is used, it
|
||||
will be preserved.
|
||||
|
||||
When used as an output option (before an output filename), decodes but discards
|
||||
When used as an output option (before an output url), decodes but discards
|
||||
input until the timestamps reach @var{position}.
|
||||
|
||||
@var{position} must be a time duration specification,
|
||||
@@ -1129,7 +1129,7 @@ may be reassigned to a different value.
|
||||
For example, to set the stream 0 PID to 33 and the stream 1 PID to 36 for
|
||||
an output mpegts file:
|
||||
@example
|
||||
ffmpeg -i infile -streamid 0:33 -streamid 1:36 out.ts
|
||||
ffmpeg -i inurl -streamid 0:33 -streamid 1:36 out.ts
|
||||
@end example
|
||||
|
||||
@item -bsf[:@var{stream_specifier}] @var{bitstream_filters} (@emph{output,per-stream})
|
||||
|
||||
+3
-3
@@ -12,7 +12,7 @@
|
||||
|
||||
@chapter Synopsis
|
||||
|
||||
ffplay [@var{options}] [@file{input_file}]
|
||||
ffplay [@var{options}] [@file{input_url}]
|
||||
|
||||
@chapter Description
|
||||
@c man begin DESCRIPTION
|
||||
@@ -106,8 +106,8 @@ the input audio.
|
||||
Use the option "-filters" to show all the available filters (including
|
||||
sources and sinks).
|
||||
|
||||
@item -i @var{input_file}
|
||||
Read @var{input_file}.
|
||||
@item -i @var{input_url}
|
||||
Read @var{input_url}.
|
||||
@end table
|
||||
|
||||
@section Advanced options
|
||||
|
||||
+5
-5
@@ -12,7 +12,7 @@
|
||||
|
||||
@chapter Synopsis
|
||||
|
||||
ffprobe [@var{options}] [@file{input_file}]
|
||||
ffprobe [@var{options}] [@file{input_url}]
|
||||
|
||||
@chapter Description
|
||||
@c man begin DESCRIPTION
|
||||
@@ -24,8 +24,8 @@ For example it can be used to check the format of the container used
|
||||
by a multimedia stream and the format and type of each media stream
|
||||
contained in it.
|
||||
|
||||
If a filename is specified in input, ffprobe will try to open and
|
||||
probe the file content. If the file cannot be opened or recognized as
|
||||
If a url is specified in input, ffprobe will try to open and
|
||||
probe the url content. If the url cannot be opened or recognized as
|
||||
a multimedia file, a positive exit code is returned.
|
||||
|
||||
ffprobe may be employed both as a standalone application or in
|
||||
@@ -332,8 +332,8 @@ with name "PIXEL_FORMAT".
|
||||
Force bitexact output, useful to produce output which is not dependent
|
||||
on the specific build.
|
||||
|
||||
@item -i @var{input_file}
|
||||
Read @var{input_file}.
|
||||
@item -i @var{input_url}
|
||||
Read @var{input_url}.
|
||||
|
||||
@end table
|
||||
@c man end
|
||||
|
||||
@@ -209,6 +209,10 @@ For example to separate the fields with newlines and indention:
|
||||
ffprobe -dump_separator "
|
||||
" -i ~/videos/matrixbench_mpeg2.mpg
|
||||
@end example
|
||||
|
||||
@item max_streams @var{integer} (@emph{input})
|
||||
Specifies the maximum number of streams. This can be used to reject files that
|
||||
would require too many resources due to a large number of streams.
|
||||
@end table
|
||||
|
||||
@c man end FORMAT OPTIONS
|
||||
|
||||
+2
-2
@@ -3108,8 +3108,8 @@ enum OptGroup {
|
||||
};
|
||||
|
||||
static const OptionGroupDef groups[] = {
|
||||
[GROUP_OUTFILE] = { "output file", NULL, OPT_OUTPUT },
|
||||
[GROUP_INFILE] = { "input file", "i", OPT_INPUT },
|
||||
[GROUP_OUTFILE] = { "output url", NULL, OPT_OUTPUT },
|
||||
[GROUP_INFILE] = { "input url", "i", OPT_INPUT },
|
||||
};
|
||||
|
||||
static int open_files(OptionGroupList *l, const char *inout,
|
||||
|
||||
@@ -874,11 +874,11 @@ static int upload_texture(SDL_Texture *tex, AVFrame *frame, struct SwsContext **
|
||||
frame->width, frame->height, frame->format, frame->width, frame->height,
|
||||
AV_PIX_FMT_BGRA, sws_flags, NULL, NULL, NULL);
|
||||
if (*img_convert_ctx != NULL) {
|
||||
uint8_t *pixels;
|
||||
int pitch;
|
||||
if (!SDL_LockTexture(tex, NULL, (void **)&pixels, &pitch)) {
|
||||
uint8_t *pixels[4];
|
||||
int pitch[4];
|
||||
if (!SDL_LockTexture(tex, NULL, (void **)pixels, pitch)) {
|
||||
sws_scale(*img_convert_ctx, (const uint8_t * const *)frame->data, frame->linesize,
|
||||
0, frame->height, &pixels, &pitch);
|
||||
0, frame->height, pixels, pitch);
|
||||
SDL_UnlockTexture(tex);
|
||||
}
|
||||
} else {
|
||||
@@ -904,8 +904,8 @@ static void video_image_display(VideoState *is)
|
||||
|
||||
if (vp->pts >= sp->pts + ((float) sp->sub.start_display_time / 1000)) {
|
||||
if (!sp->uploaded) {
|
||||
uint8_t *pixels;
|
||||
int pitch;
|
||||
uint8_t* pixels[4];
|
||||
int pitch[4];
|
||||
int i;
|
||||
if (!sp->width || !sp->height) {
|
||||
sp->width = vp->width;
|
||||
@@ -930,9 +930,9 @@ static void video_image_display(VideoState *is)
|
||||
av_log(NULL, AV_LOG_FATAL, "Cannot initialize the conversion context\n");
|
||||
return;
|
||||
}
|
||||
if (!SDL_LockTexture(is->sub_texture, (SDL_Rect *)sub_rect, (void **)&pixels, &pitch)) {
|
||||
if (!SDL_LockTexture(is->sub_texture, (SDL_Rect *)sub_rect, (void **)pixels, pitch)) {
|
||||
sws_scale(is->sub_convert_ctx, (const uint8_t * const *)sub_rect->data, sub_rect->linesize,
|
||||
0, sub_rect->h, &pixels, &pitch);
|
||||
0, sub_rect->h, pixels, pitch);
|
||||
SDL_UnlockTexture(is->sub_texture);
|
||||
}
|
||||
}
|
||||
|
||||
+4
-1
@@ -2702,8 +2702,10 @@ static int http_receive_data(HTTPContext *c)
|
||||
} else if (c->buffer_ptr - c->buffer >= 2 &&
|
||||
!memcmp(c->buffer_ptr - 1, "\r\n", 2)) {
|
||||
c->chunk_size = strtol(c->buffer, 0, 16);
|
||||
if (c->chunk_size == 0) // end of stream
|
||||
if (c->chunk_size <= 0) { // end of stream or invalid chunk size
|
||||
c->chunk_size = 0;
|
||||
goto fail;
|
||||
}
|
||||
c->buffer_ptr = c->buffer;
|
||||
break;
|
||||
} else if (++loop_run > 10)
|
||||
@@ -2725,6 +2727,7 @@ static int http_receive_data(HTTPContext *c)
|
||||
/* end of connection : close it */
|
||||
goto fail;
|
||||
else {
|
||||
av_assert0(len <= c->chunk_size);
|
||||
c->chunk_size -= len;
|
||||
c->buffer_ptr += len;
|
||||
c->data_count += len;
|
||||
|
||||
@@ -323,6 +323,8 @@ done:
|
||||
av_dict_free(&recommended);
|
||||
av_stream_set_recommended_encoder_configuration(st, enc_config);
|
||||
st->codec = av;
|
||||
st->codecpar = avcodec_parameters_alloc();
|
||||
avcodec_parameters_from_context(st->codecpar, av);
|
||||
stream->streams[stream->nb_streams++] = st;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -403,7 +403,7 @@ void av_bsf_list_free(AVBSFList **lst)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (*lst)
|
||||
if (!*lst)
|
||||
return;
|
||||
|
||||
for (i = 0; i < (*lst)->nb_bsfs; ++i)
|
||||
|
||||
@@ -310,7 +310,7 @@ static int parse_tonal(DCALbrDecoder *s, int group)
|
||||
break; // End of subframe
|
||||
|
||||
freq += diff - 2;
|
||||
if (freq >> (5 - group) > s->nsubbands * 4 - 5) {
|
||||
if (freq >> (5 - group) > s->nsubbands * 4 - 6) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "Invalid spectral line offset\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
+14
-4
@@ -1089,7 +1089,6 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
|
||||
FFV1Context *f = avctx->priv_data;
|
||||
RangeCoder *const c = &f->slice_context[0]->c;
|
||||
AVFrame *const p = f->picture.f;
|
||||
int used_count = 0;
|
||||
uint8_t keystate = 128;
|
||||
uint8_t *buf_p;
|
||||
int i, ret;
|
||||
@@ -1145,6 +1144,11 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
|
||||
if (f->version > 3)
|
||||
maxsize = AV_INPUT_BUFFER_MIN_SIZE + avctx->width*avctx->height*3LL*4;
|
||||
|
||||
if (maxsize > INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE - 32) {
|
||||
av_log(avctx, AV_LOG_WARNING, "Cannot allocate worst case packet size, the encoding could fail\n");
|
||||
maxsize = INT_MAX - AV_INPUT_BUFFER_PADDING_SIZE - 32;
|
||||
}
|
||||
|
||||
if ((ret = ff_alloc_packet2(avctx, pkt, maxsize, 0)) < 0)
|
||||
return ret;
|
||||
|
||||
@@ -1178,11 +1182,17 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 1; i < f->slice_count; i++) {
|
||||
for (i = 0; i < f->slice_count; i++) {
|
||||
FFV1Context *fs = f->slice_context[i];
|
||||
uint8_t *start = pkt->data + (pkt->size - used_count) * (int64_t)i / f->slice_count;
|
||||
uint8_t *start = pkt->data + pkt->size * (int64_t)i / f->slice_count;
|
||||
int len = pkt->size / f->slice_count;
|
||||
ff_init_range_encoder(&fs->c, start, len);
|
||||
if (i) {
|
||||
ff_init_range_encoder(&fs->c, start, len);
|
||||
} else {
|
||||
av_assert0(fs->c.bytestream_end >= fs->c.bytestream_start + len);
|
||||
av_assert0(fs->c.bytestream < fs->c.bytestream_start + len);
|
||||
fs->c.bytestream_end = fs->c.bytestream_start + len;
|
||||
}
|
||||
}
|
||||
avctx->execute(avctx, encode_slice, &f->slice_context[0], NULL,
|
||||
f->slice_count, sizeof(void *));
|
||||
|
||||
@@ -586,10 +586,12 @@ static int flac_parse(AVCodecParserContext *s, AVCodecContext *avctx,
|
||||
temp = curr->next;
|
||||
av_freep(&curr->link_penalty);
|
||||
av_free(curr);
|
||||
fpc->nb_headers_buffered--;
|
||||
}
|
||||
fpc->headers = fpc->best_header->next;
|
||||
av_freep(&fpc->best_header->link_penalty);
|
||||
av_freep(&fpc->best_header);
|
||||
fpc->nb_headers_buffered--;
|
||||
}
|
||||
|
||||
/* Find and score new headers. */
|
||||
|
||||
@@ -268,7 +268,8 @@ static int decode_subframe_fixed(FLACContext *s, int32_t *decoded,
|
||||
int pred_order, int bps)
|
||||
{
|
||||
const int blocksize = s->blocksize;
|
||||
int av_uninit(a), av_uninit(b), av_uninit(c), av_uninit(d), i;
|
||||
unsigned av_uninit(a), av_uninit(b), av_uninit(c), av_uninit(d);
|
||||
int i;
|
||||
int ret;
|
||||
|
||||
/* warm up samples */
|
||||
@@ -447,7 +448,7 @@ static inline int decode_subframe(FLACContext *s, int channel)
|
||||
if (wasted) {
|
||||
int i;
|
||||
for (i = 0; i < s->blocksize; i++)
|
||||
decoded[i] <<= wasted;
|
||||
decoded[i] = (unsigned)decoded[i] << wasted;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -56,7 +56,7 @@ static void FUNC(flac_decorrelate_indep_c)(uint8_t **out, int32_t **in,
|
||||
|
||||
for (j = 0; j < len; j++)
|
||||
for (i = 0; i < channels; i++)
|
||||
S(samples, i, j) = in[i][j] << shift;
|
||||
S(samples, i, j) = (int)((unsigned)in[i][j] << shift);
|
||||
}
|
||||
|
||||
static void FUNC(flac_decorrelate_ls_c)(uint8_t **out, int32_t **in,
|
||||
|
||||
@@ -369,6 +369,10 @@ static inline uint64_t get_bits64(GetBitContext *s, int n)
|
||||
*/
|
||||
static inline int get_sbits_long(GetBitContext *s, int n)
|
||||
{
|
||||
// sign_extend(x, 0) is undefined
|
||||
if (!n)
|
||||
return 0;
|
||||
|
||||
return sign_extend(get_bits_long(s, n), n);
|
||||
}
|
||||
|
||||
|
||||
@@ -1771,8 +1771,10 @@ int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl,
|
||||
return ret;
|
||||
|
||||
// discard redundant pictures
|
||||
if (sl->redundant_pic_count > 0)
|
||||
if (sl->redundant_pic_count > 0) {
|
||||
sl->ref_count[0] = sl->ref_count[1] = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (sl->first_mb_addr == 0 || !h->current_slice) {
|
||||
if (h->setup_finished) {
|
||||
|
||||
@@ -989,6 +989,11 @@ static int ipvideo_decode_frame(AVCodecContext *avctx,
|
||||
AVFrame *frame = data;
|
||||
int ret;
|
||||
|
||||
if (av_packet_get_side_data(avpkt, AV_PKT_DATA_PARAM_CHANGE, NULL)) {
|
||||
av_frame_unref(s->last_frame);
|
||||
av_frame_unref(s->second_last_frame);
|
||||
}
|
||||
|
||||
if (buf_size < 2)
|
||||
return AVERROR_INVALIDDATA;
|
||||
|
||||
@@ -1000,10 +1005,6 @@ static int ipvideo_decode_frame(AVCodecContext *avctx,
|
||||
if (buf_size < s->decoding_map_size + 2)
|
||||
return buf_size;
|
||||
|
||||
if (av_packet_get_side_data(avpkt, AV_PKT_DATA_PARAM_CHANGE, NULL)) {
|
||||
av_frame_unref(s->last_frame);
|
||||
av_frame_unref(s->second_last_frame);
|
||||
}
|
||||
|
||||
s->decoding_map = buf + 2;
|
||||
bytestream2_init(&s->stream_ptr, buf + 2 + s->decoding_map_size,
|
||||
|
||||
+1
-1
@@ -76,7 +76,7 @@ typedef struct MECmpContext {
|
||||
me_cmp_func frame_skip_cmp[6]; // only width 8 used
|
||||
|
||||
me_cmp_func pix_abs[2][4];
|
||||
me_cmp_func median_sad[2];
|
||||
me_cmp_func median_sad[6];
|
||||
} MECmpContext;
|
||||
|
||||
void ff_me_cmp_init_static(void);
|
||||
|
||||
@@ -1082,6 +1082,10 @@ static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s, int predictor,
|
||||
|
||||
for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
|
||||
for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
|
||||
if (get_bits_left(&s->gb) < 1) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "bitstream end in yuv_scan\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
if (s->restart_interval && !s->restart_count){
|
||||
s->restart_count = s->restart_interval;
|
||||
resync_mb_x = mb_x;
|
||||
@@ -1393,6 +1397,10 @@ static int mjpeg_decode_scan_progressive_ac(MJpegDecodeContext *s, int ss,
|
||||
int block_idx = mb_y * s->block_stride[c];
|
||||
int16_t (*block)[64] = &s->blocks[c][block_idx];
|
||||
uint8_t *last_nnz = &s->last_nnz[c][block_idx];
|
||||
if (get_bits_left(&s->gb) <= 0) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "bitstream truncated in mjpeg_decode_scan_progressive_ac\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
for (mb_x = 0; mb_x < s->mb_width; mb_x++, block++, last_nnz++) {
|
||||
int ret;
|
||||
if (s->restart_interval && !s->restart_count)
|
||||
@@ -2386,7 +2394,7 @@ the_end:
|
||||
}
|
||||
}
|
||||
}
|
||||
if (s->flipped) {
|
||||
if (s->flipped && !s->rgb) {
|
||||
int j;
|
||||
avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &hshift, &vshift);
|
||||
av_assert0(s->nb_components == av_pix_fmt_count_planes(s->picture_ptr->format));
|
||||
|
||||
@@ -116,6 +116,8 @@ static void mov_text_cleanup(MovTextContext *m)
|
||||
av_freep(&m->s[i]);
|
||||
}
|
||||
av_freep(&m->s);
|
||||
m->count_s = 0;
|
||||
m->style_entries = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -279,12 +281,14 @@ static int decode_hclr(const uint8_t *tsmb, MovTextContext *m, AVPacket *avpkt)
|
||||
static int decode_styl(const uint8_t *tsmb, MovTextContext *m, AVPacket *avpkt)
|
||||
{
|
||||
int i;
|
||||
m->style_entries = AV_RB16(tsmb);
|
||||
int style_entries = AV_RB16(tsmb);
|
||||
tsmb += 2;
|
||||
// A single style record is of length 12 bytes.
|
||||
if (m->tracksize + m->size_var + 2 + m->style_entries * 12 > avpkt->size)
|
||||
if (m->tracksize + m->size_var + 2 + style_entries * 12 > avpkt->size)
|
||||
return -1;
|
||||
|
||||
m->style_entries = style_entries;
|
||||
|
||||
m->box_flags |= STYL_BOX;
|
||||
for(i = 0; i < m->style_entries; i++) {
|
||||
m->s_temp = av_malloc(sizeof(*m->s_temp));
|
||||
|
||||
@@ -315,13 +315,13 @@ static int mpeg4_decode_sprite_trajectory(Mpeg4DecContext *ctx, GetBitContext *g
|
||||
min_ab = FFMIN(alpha, beta);
|
||||
w3 = w2 >> min_ab;
|
||||
h3 = h2 >> min_ab;
|
||||
s->sprite_offset[0][0] = (sprite_ref[0][0] << (alpha + beta + rho - min_ab)) +
|
||||
s->sprite_offset[0][0] = (sprite_ref[0][0] * (1<<(alpha + beta + rho - min_ab))) +
|
||||
(-r * sprite_ref[0][0] + virtual_ref[0][0]) *
|
||||
h3 * (-vop_ref[0][0]) +
|
||||
(-r * sprite_ref[0][0] + virtual_ref[1][0]) *
|
||||
w3 * (-vop_ref[0][1]) +
|
||||
(1 << (alpha + beta + rho - min_ab - 1));
|
||||
s->sprite_offset[0][1] = (sprite_ref[0][1] << (alpha + beta + rho - min_ab)) +
|
||||
s->sprite_offset[0][1] = (sprite_ref[0][1] * (1 << (alpha + beta + rho - min_ab))) +
|
||||
(-r * sprite_ref[0][1] + virtual_ref[0][1]) *
|
||||
h3 * (-vop_ref[0][0]) +
|
||||
(-r * sprite_ref[0][1] + virtual_ref[1][1]) *
|
||||
@@ -368,10 +368,10 @@ static int mpeg4_decode_sprite_trajectory(Mpeg4DecContext *ctx, GetBitContext *g
|
||||
int shift_y = 16 - ctx->sprite_shift[0];
|
||||
int shift_c = 16 - ctx->sprite_shift[1];
|
||||
for (i = 0; i < 2; i++) {
|
||||
s->sprite_offset[0][i] <<= shift_y;
|
||||
s->sprite_offset[1][i] <<= shift_c;
|
||||
s->sprite_delta[0][i] <<= shift_y;
|
||||
s->sprite_delta[1][i] <<= shift_y;
|
||||
s->sprite_offset[0][i] *= 1 << shift_y;
|
||||
s->sprite_offset[1][i] *= 1 << shift_c;
|
||||
s->sprite_delta[0][i] *= 1 << shift_y;
|
||||
s->sprite_delta[1][i] *= 1 << shift_y;
|
||||
ctx->sprite_shift[i] = 16;
|
||||
}
|
||||
s->real_sprite_warping_points = ctx->num_sprite_warping_points;
|
||||
|
||||
+4
-1
@@ -761,7 +761,10 @@ static int omx_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
|
||||
} else {
|
||||
// If not, we need to allocate a new buffer with the right
|
||||
// size and copy the input frame into it.
|
||||
uint8_t *buf = av_malloc(av_image_get_buffer_size(avctx->pix_fmt, s->stride, s->plane_size, 1));
|
||||
uint8_t *buf = NULL;
|
||||
int image_buffer_size = av_image_get_buffer_size(avctx->pix_fmt, s->stride, s->plane_size, 1);
|
||||
if (image_buffer_size >= 0)
|
||||
buf = av_malloc(image_buffer_size);
|
||||
if (!buf) {
|
||||
// Return the buffer to the queue so it's not lost
|
||||
append_buffer(&s->input_mutex, &s->input_cond, &s->num_free_in_buffers, s->free_in_buffers, buffer);
|
||||
|
||||
@@ -300,8 +300,11 @@ static int parse_object_segment(AVCodecContext *avctx,
|
||||
|
||||
av_fast_padded_malloc(&object->rle, &object->rle_buffer_size, rle_bitmap_len);
|
||||
|
||||
if (!object->rle)
|
||||
if (!object->rle) {
|
||||
object->rle_data_len = 0;
|
||||
object->rle_remaining_len = 0;
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
|
||||
memcpy(object->rle, buf, buf_size);
|
||||
object->rle_data_len = buf_size;
|
||||
|
||||
@@ -142,7 +142,7 @@ static int decode_frame(AVCodecContext *avctx,
|
||||
|
||||
if (av_image_check_size(s->width, s->height, 0, avctx) < 0)
|
||||
return -1;
|
||||
if (s->width != avctx->width && s->height != avctx->height) {
|
||||
if (s->width != avctx->width || s->height != avctx->height) {
|
||||
ret = ff_set_dimensions(avctx, s->width, s->height);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
+17
-4
@@ -437,13 +437,13 @@ static int decode_zbuf(AVBPrint *bp, const uint8_t *data,
|
||||
av_bprint_init(bp, 0, -1);
|
||||
|
||||
while (zstream.avail_in > 0) {
|
||||
av_bprint_get_buffer(bp, 1, &buf, &buf_size);
|
||||
if (!buf_size) {
|
||||
av_bprint_get_buffer(bp, 2, &buf, &buf_size);
|
||||
if (buf_size < 2) {
|
||||
ret = AVERROR(ENOMEM);
|
||||
goto fail;
|
||||
}
|
||||
zstream.next_out = buf;
|
||||
zstream.avail_out = buf_size;
|
||||
zstream.avail_out = buf_size - 1;
|
||||
ret = inflate(&zstream, Z_PARTIAL_FLUSH);
|
||||
if (ret != Z_OK && ret != Z_STREAM_END) {
|
||||
ret = AVERROR_EXTERNAL;
|
||||
@@ -772,6 +772,16 @@ static int decode_trns_chunk(AVCodecContext *avctx, PNGDecContext *s,
|
||||
{
|
||||
int v, i;
|
||||
|
||||
if (!(s->state & PNG_IHDR)) {
|
||||
av_log(avctx, AV_LOG_ERROR, "trns before IHDR\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
if (s->state & PNG_IDAT) {
|
||||
av_log(avctx, AV_LOG_ERROR, "trns after IDAT\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
if (s->color_type == PNG_COLOR_TYPE_PALETTE) {
|
||||
if (length > 256 || !(s->state & PNG_PLTE))
|
||||
return AVERROR_INVALIDDATA;
|
||||
@@ -782,7 +792,8 @@ static int decode_trns_chunk(AVCodecContext *avctx, PNGDecContext *s,
|
||||
}
|
||||
} else if (s->color_type == PNG_COLOR_TYPE_GRAY || s->color_type == PNG_COLOR_TYPE_RGB) {
|
||||
if ((s->color_type == PNG_COLOR_TYPE_GRAY && length != 2) ||
|
||||
(s->color_type == PNG_COLOR_TYPE_RGB && length != 6))
|
||||
(s->color_type == PNG_COLOR_TYPE_RGB && length != 6) ||
|
||||
s->bit_depth == 1)
|
||||
return AVERROR_INVALIDDATA;
|
||||
|
||||
for (i = 0; i < length / 2; i++) {
|
||||
@@ -1241,6 +1252,8 @@ exit_loop:
|
||||
size_t raw_bpp = s->bpp - byte_depth;
|
||||
unsigned x, y;
|
||||
|
||||
av_assert0(s->bit_depth > 1);
|
||||
|
||||
for (y = 0; y < s->height; ++y) {
|
||||
uint8_t *row = &s->image_buf[s->image_linesize * y];
|
||||
|
||||
|
||||
+6
-1
@@ -376,6 +376,10 @@ void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height,
|
||||
w_align = 4;
|
||||
h_align = 4;
|
||||
}
|
||||
if (s->codec_id == AV_CODEC_ID_INTERPLAY_VIDEO) {
|
||||
w_align = 8;
|
||||
h_align = 8;
|
||||
}
|
||||
break;
|
||||
case AV_PIX_FMT_PAL8:
|
||||
case AV_PIX_FMT_BGR8:
|
||||
@@ -385,7 +389,8 @@ void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height,
|
||||
w_align = 4;
|
||||
h_align = 4;
|
||||
}
|
||||
if (s->codec_id == AV_CODEC_ID_JV) {
|
||||
if (s->codec_id == AV_CODEC_ID_JV ||
|
||||
s->codec_id == AV_CODEC_ID_INTERPLAY_VIDEO) {
|
||||
w_align = 8;
|
||||
h_align = 8;
|
||||
}
|
||||
|
||||
+7
-1
@@ -170,7 +170,7 @@ static int vp5_parse_coeff_models(VP56Context *s)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void vp5_parse_coeff(VP56Context *s)
|
||||
static int vp5_parse_coeff(VP56Context *s)
|
||||
{
|
||||
VP56RangeCoder *c = &s->c;
|
||||
VP56Model *model = s->modelp;
|
||||
@@ -180,6 +180,11 @@ static void vp5_parse_coeff(VP56Context *s)
|
||||
int b, i, cg, idx, ctx, ctx_last;
|
||||
int pt = 0; /* plane type (0 for Y, 1 for U or V) */
|
||||
|
||||
if (c->end >= c->buffer && c->bits >= 0) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "End of AC stream reached in vp5_parse_coeff\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
for (b=0; b<6; b++) {
|
||||
int ct = 1; /* code type */
|
||||
|
||||
@@ -245,6 +250,7 @@ static void vp5_parse_coeff(VP56Context *s)
|
||||
s->coeff_ctx[ff_vp56_b6to4[b]][i] = 5;
|
||||
s->above_blocks[s->above_block_idx[b]].not_null_dc = s->coeff_ctx[ff_vp56_b6to4[b]][0];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void vp5_default_models_init(VP56Context *s)
|
||||
|
||||
+10
-4
@@ -381,12 +381,13 @@ static void vp56_mc(VP56Context *s, int b, int plane, uint8_t *src,
|
||||
}
|
||||
}
|
||||
|
||||
static void vp56_decode_mb(VP56Context *s, int row, int col, int is_alpha)
|
||||
static int vp56_decode_mb(VP56Context *s, int row, int col, int is_alpha)
|
||||
{
|
||||
AVFrame *frame_current, *frame_ref;
|
||||
VP56mb mb_type;
|
||||
VP56Frame ref_frame;
|
||||
int b, ab, b_max, plane, off;
|
||||
int ret;
|
||||
|
||||
if (s->frames[VP56_FRAME_CURRENT]->key_frame)
|
||||
mb_type = VP56_MB_INTRA;
|
||||
@@ -394,14 +395,16 @@ static void vp56_decode_mb(VP56Context *s, int row, int col, int is_alpha)
|
||||
mb_type = vp56_decode_mv(s, row, col);
|
||||
ref_frame = ff_vp56_reference_frame[mb_type];
|
||||
|
||||
s->parse_coeff(s);
|
||||
ret = s->parse_coeff(s);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
vp56_add_predictors_dc(s, ref_frame);
|
||||
|
||||
frame_current = s->frames[VP56_FRAME_CURRENT];
|
||||
frame_ref = s->frames[ref_frame];
|
||||
if (mb_type != VP56_MB_INTRA && !frame_ref->data[0])
|
||||
return;
|
||||
return 0;
|
||||
|
||||
ab = 6*is_alpha;
|
||||
b_max = 6 - 2*is_alpha;
|
||||
@@ -451,6 +454,7 @@ static void vp56_decode_mb(VP56Context *s, int row, int col, int is_alpha)
|
||||
s->block_coeff[4][0] = 0;
|
||||
s->block_coeff[5][0] = 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vp56_size_changed(VP56Context *s)
|
||||
@@ -653,7 +657,9 @@ static int ff_vp56_decode_mbs(AVCodecContext *avctx, void *data,
|
||||
s->block_offset[5] = s->block_offset[4];
|
||||
|
||||
for (mb_col=0; mb_col<s->mb_width; mb_col++) {
|
||||
vp56_decode_mb(s, mb_row, mb_col, is_alpha);
|
||||
int ret = vp56_decode_mb(s, mb_row, mb_col, is_alpha);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
for (y=0; y<4; y++) {
|
||||
s->above_block_idx[y] += 2;
|
||||
|
||||
+1
-1
@@ -74,7 +74,7 @@ typedef void (*VP56ParseVectorAdjustment)(VP56Context *s,
|
||||
typedef void (*VP56Filter)(VP56Context *s, uint8_t *dst, uint8_t *src,
|
||||
int offset1, int offset2, int stride,
|
||||
VP56mv mv, int mask, int select, int luma);
|
||||
typedef void (*VP56ParseCoeff)(VP56Context *s);
|
||||
typedef int (*VP56ParseCoeff)(VP56Context *s);
|
||||
typedef void (*VP56DefaultModelsInit)(VP56Context *s);
|
||||
typedef void (*VP56ParseVectorModels)(VP56Context *s);
|
||||
typedef int (*VP56ParseCoeffModels)(VP56Context *s);
|
||||
|
||||
+12
-5
@@ -40,8 +40,8 @@
|
||||
|
||||
#define VP6_MAX_HUFF_SIZE 12
|
||||
|
||||
static void vp6_parse_coeff(VP56Context *s);
|
||||
static void vp6_parse_coeff_huffman(VP56Context *s);
|
||||
static int vp6_parse_coeff(VP56Context *s);
|
||||
static int vp6_parse_coeff_huffman(VP56Context *s);
|
||||
|
||||
static int vp6_parse_header(VP56Context *s, const uint8_t *buf, int buf_size)
|
||||
{
|
||||
@@ -380,7 +380,7 @@ static unsigned vp6_get_nb_null(VP56Context *s)
|
||||
return val;
|
||||
}
|
||||
|
||||
static void vp6_parse_coeff_huffman(VP56Context *s)
|
||||
static int vp6_parse_coeff_huffman(VP56Context *s)
|
||||
{
|
||||
VP56Model *model = s->modelp;
|
||||
uint8_t *permute = s->idct_scantable;
|
||||
@@ -402,7 +402,7 @@ static void vp6_parse_coeff_huffman(VP56Context *s)
|
||||
break;
|
||||
} else {
|
||||
if (get_bits_left(&s->gb) <= 0)
|
||||
return;
|
||||
return AVERROR_INVALIDDATA;
|
||||
coeff = get_vlc2(&s->gb, vlc_coeff->table, FF_HUFFMAN_BITS, 3);
|
||||
if (coeff == 0) {
|
||||
if (coeff_idx) {
|
||||
@@ -437,9 +437,10 @@ static void vp6_parse_coeff_huffman(VP56Context *s)
|
||||
vlc_coeff = &s->ract_vlc[pt][ct][cg];
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void vp6_parse_coeff(VP56Context *s)
|
||||
static int vp6_parse_coeff(VP56Context *s)
|
||||
{
|
||||
VP56RangeCoder *c = s->ccp;
|
||||
VP56Model *model = s->modelp;
|
||||
@@ -449,6 +450,11 @@ static void vp6_parse_coeff(VP56Context *s)
|
||||
int b, i, cg, idx, ctx;
|
||||
int pt = 0; /* plane type (0 for Y, 1 for U or V) */
|
||||
|
||||
if (c->end >= c->buffer && c->bits >= 0) {
|
||||
av_log(s->avctx, AV_LOG_ERROR, "End of AC stream reached in vp6_parse_coeff\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
for (b=0; b<6; b++) {
|
||||
int ct = 1; /* code type */
|
||||
int run = 1;
|
||||
@@ -512,6 +518,7 @@ static void vp6_parse_coeff(VP56Context *s)
|
||||
s->left_block[ff_vp56_b6to4[b]].not_null_dc =
|
||||
s->above_blocks[s->above_block_idx[b]].not_null_dc = !!s->block_coeff[b][0];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vp6_block_variance(uint8_t *src, int stride)
|
||||
|
||||
@@ -191,7 +191,7 @@ fail:
|
||||
#define OFFSET(x) offsetof(CudaUploadContext, x)
|
||||
#define FLAGS (AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
|
||||
static const AVOption cudaupload_options[] = {
|
||||
{ "device", "Number of the device to use", OFFSET(device_idx), AV_OPT_TYPE_INT, { .i64 = 0 }, .flags = FLAGS },
|
||||
{ "device", "Number of the device to use", OFFSET(device_idx), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, FLAGS },
|
||||
{ NULL },
|
||||
};
|
||||
|
||||
|
||||
@@ -1899,6 +1899,13 @@ typedef struct AVFormatContext {
|
||||
* - decoding: set by user through AVOptions (NO direct access)
|
||||
*/
|
||||
char *protocol_blacklist;
|
||||
|
||||
/**
|
||||
* The maximum number of streams.
|
||||
* - encoding: unused
|
||||
* - decoding: set by user through AVOptions (NO direct access)
|
||||
*/
|
||||
int max_streams;
|
||||
} AVFormatContext;
|
||||
|
||||
int av_format_get_probe_score(const AVFormatContext *s);
|
||||
|
||||
@@ -1203,7 +1203,8 @@ start_sync:
|
||||
if ((d[0] == 'i' && d[1] == 'x' && n < s->nb_streams) ||
|
||||
// parse JUNK
|
||||
(d[0] == 'J' && d[1] == 'U' && d[2] == 'N' && d[3] == 'K') ||
|
||||
(d[0] == 'i' && d[1] == 'd' && d[2] == 'x' && d[3] == '1')) {
|
||||
(d[0] == 'i' && d[1] == 'd' && d[2] == 'x' && d[3] == '1') ||
|
||||
(d[0] == 'i' && d[1] == 'n' && d[2] == 'd' && d[3] == 'x')) {
|
||||
avio_skip(pb, size);
|
||||
goto start_sync;
|
||||
}
|
||||
|
||||
@@ -39,7 +39,11 @@ typedef struct ChromaprintMuxContext {
|
||||
int silence_threshold;
|
||||
int algorithm;
|
||||
FingerprintFormat fp_format;
|
||||
#if CPR_VERSION_INT >= AV_VERSION_INT(1, 4, 0)
|
||||
ChromaprintContext *ctx;
|
||||
#else
|
||||
ChromaprintContext ctx;
|
||||
#endif
|
||||
} ChromaprintMuxContext;
|
||||
|
||||
static void cleanup(ChromaprintMuxContext *cpr)
|
||||
|
||||
@@ -388,7 +388,7 @@ static int ffm2_read_header(AVFormatContext *s)
|
||||
}
|
||||
break;
|
||||
case MKBETAG('S', 'T', 'V', 'I'):
|
||||
if (f_stvi++) {
|
||||
if (f_stvi++ || codec->codec_type != AVMEDIA_TYPE_VIDEO) {
|
||||
ret = AVERROR(EINVAL);
|
||||
goto fail;
|
||||
}
|
||||
@@ -452,7 +452,7 @@ static int ffm2_read_header(AVFormatContext *s)
|
||||
codec->refs = avio_rb32(pb);
|
||||
break;
|
||||
case MKBETAG('S', 'T', 'A', 'U'):
|
||||
if (f_stau++) {
|
||||
if (f_stau++ || codec->codec_type != AVMEDIA_TYPE_AUDIO) {
|
||||
ret = AVERROR(EINVAL);
|
||||
goto fail;
|
||||
}
|
||||
@@ -481,7 +481,7 @@ static int ffm2_read_header(AVFormatContext *s)
|
||||
}
|
||||
break;
|
||||
case MKBETAG('S', '2', 'V', 'I'):
|
||||
if (f_stvi++ || !size) {
|
||||
if (f_stvi++ || !size || codec->codec_type != AVMEDIA_TYPE_VIDEO) {
|
||||
ret = AVERROR(EINVAL);
|
||||
goto fail;
|
||||
}
|
||||
@@ -496,7 +496,7 @@ static int ffm2_read_header(AVFormatContext *s)
|
||||
goto fail;
|
||||
break;
|
||||
case MKBETAG('S', '2', 'A', 'U'):
|
||||
if (f_stau++ || !size) {
|
||||
if (f_stau++ || !size || codec->codec_type != AVMEDIA_TYPE_AUDIO) {
|
||||
ret = AVERROR(EINVAL);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
@@ -65,7 +65,8 @@ static int flac_read_header(AVFormatContext *s)
|
||||
|
||||
/* process metadata blocks */
|
||||
while (!avio_feof(s->pb) && !metadata_last) {
|
||||
avio_read(s->pb, header, 4);
|
||||
if (avio_read(s->pb, header, 4) != 4)
|
||||
return AVERROR(AVERROR_INVALIDDATA);
|
||||
flac_parse_block_header(header, &metadata_last, &metadata_type,
|
||||
&metadata_size);
|
||||
switch (metadata_type) {
|
||||
|
||||
+60
-49
@@ -62,8 +62,8 @@ typedef struct HTTPContext {
|
||||
int line_count;
|
||||
int http_code;
|
||||
/* Used if "Transfer-Encoding: chunked" otherwise -1. */
|
||||
int64_t chunksize;
|
||||
int64_t off, end_off, filesize;
|
||||
uint64_t chunksize;
|
||||
uint64_t off, end_off, filesize;
|
||||
char *location;
|
||||
HTTPAuthState auth_state;
|
||||
HTTPAuthState proxy_auth_state;
|
||||
@@ -95,9 +95,9 @@ typedef struct HTTPContext {
|
||||
AVDictionary *cookie_dict;
|
||||
int icy;
|
||||
/* how much data was read since the last ICY metadata packet */
|
||||
int icy_data_read;
|
||||
uint64_t icy_data_read;
|
||||
/* after how many bytes of read data a new metadata packet will be found */
|
||||
int icy_metaint;
|
||||
uint64_t icy_metaint;
|
||||
char *icy_metadata_headers;
|
||||
char *icy_metadata_packet;
|
||||
AVDictionary *metadata;
|
||||
@@ -489,7 +489,7 @@ static int http_open(URLContext *h, const char *uri, int flags,
|
||||
else
|
||||
h->is_streamed = 1;
|
||||
|
||||
s->filesize = -1;
|
||||
s->filesize = UINT64_MAX;
|
||||
s->location = av_strdup(uri);
|
||||
if (!s->location)
|
||||
return AVERROR(ENOMEM);
|
||||
@@ -616,9 +616,9 @@ static void parse_content_range(URLContext *h, const char *p)
|
||||
|
||||
if (!strncmp(p, "bytes ", 6)) {
|
||||
p += 6;
|
||||
s->off = strtoll(p, NULL, 10);
|
||||
s->off = strtoull(p, NULL, 10);
|
||||
if ((slash = strchr(p, '/')) && strlen(slash) > 0)
|
||||
s->filesize = strtoll(slash + 1, NULL, 10);
|
||||
s->filesize = strtoull(slash + 1, NULL, 10);
|
||||
}
|
||||
if (s->seekable == -1 && (!s->is_akamai || s->filesize != 2147483647))
|
||||
h->is_streamed = 0; /* we _can_ in fact seek */
|
||||
@@ -808,8 +808,9 @@ static int process_line(URLContext *h, char *line, int line_count,
|
||||
if ((ret = parse_location(s, p)) < 0)
|
||||
return ret;
|
||||
*new_location = 1;
|
||||
} else if (!av_strcasecmp(tag, "Content-Length") && s->filesize == -1) {
|
||||
s->filesize = strtoll(p, NULL, 10);
|
||||
} else if (!av_strcasecmp(tag, "Content-Length") &&
|
||||
s->filesize == UINT64_MAX) {
|
||||
s->filesize = strtoull(p, NULL, 10);
|
||||
} else if (!av_strcasecmp(tag, "Content-Range")) {
|
||||
parse_content_range(h, p);
|
||||
} else if (!av_strcasecmp(tag, "Accept-Ranges") &&
|
||||
@@ -818,7 +819,7 @@ static int process_line(URLContext *h, char *line, int line_count,
|
||||
h->is_streamed = 0;
|
||||
} else if (!av_strcasecmp(tag, "Transfer-Encoding") &&
|
||||
!av_strncasecmp(p, "chunked", 7)) {
|
||||
s->filesize = -1;
|
||||
s->filesize = UINT64_MAX;
|
||||
s->chunksize = 0;
|
||||
} else if (!av_strcasecmp(tag, "WWW-Authenticate")) {
|
||||
ff_http_auth_handle_header(&s->auth_state, tag, p);
|
||||
@@ -842,7 +843,7 @@ static int process_line(URLContext *h, char *line, int line_count,
|
||||
if (parse_cookie(s, p, &s->cookie_dict))
|
||||
av_log(h, AV_LOG_WARNING, "Unable to parse '%s'\n", p);
|
||||
} else if (!av_strcasecmp(tag, "Icy-MetaInt")) {
|
||||
s->icy_metaint = strtoll(p, NULL, 10);
|
||||
s->icy_metaint = strtoull(p, NULL, 10);
|
||||
} else if (!av_strncasecmp(tag, "Icy-", 4)) {
|
||||
if ((ret = parse_icy(s, tag, p)) < 0)
|
||||
return ret;
|
||||
@@ -972,7 +973,7 @@ static int http_read_header(URLContext *h, int *new_location)
|
||||
char line[MAX_URL_SIZE];
|
||||
int err = 0;
|
||||
|
||||
s->chunksize = -1;
|
||||
s->chunksize = UINT64_MAX;
|
||||
|
||||
for (;;) {
|
||||
if ((err = http_get_line(s, line, sizeof(line))) < 0)
|
||||
@@ -1006,7 +1007,7 @@ static int http_connect(URLContext *h, const char *path, const char *local_path,
|
||||
int post, err;
|
||||
char headers[HTTP_HEADERS_SIZE] = "";
|
||||
char *authstr = NULL, *proxyauthstr = NULL;
|
||||
int64_t off = s->off;
|
||||
uint64_t off = s->off;
|
||||
int len = 0;
|
||||
const char *method;
|
||||
int send_expect_100 = 0;
|
||||
@@ -1060,7 +1061,7 @@ static int http_connect(URLContext *h, const char *path, const char *local_path,
|
||||
// server supports seeking by analysing the reply headers.
|
||||
if (!has_header(s->headers, "\r\nRange: ") && !post && (s->off > 0 || s->end_off || s->seekable == -1)) {
|
||||
len += av_strlcatf(headers + len, sizeof(headers) - len,
|
||||
"Range: bytes=%"PRId64"-", s->off);
|
||||
"Range: bytes=%"PRIu64"-", s->off);
|
||||
if (s->end_off)
|
||||
len += av_strlcatf(headers + len, sizeof(headers) - len,
|
||||
"%"PRId64, s->end_off - 1);
|
||||
@@ -1135,7 +1136,7 @@ static int http_connect(URLContext *h, const char *path, const char *local_path,
|
||||
s->line_count = 0;
|
||||
s->off = 0;
|
||||
s->icy_data_read = 0;
|
||||
s->filesize = -1;
|
||||
s->filesize = UINT64_MAX;
|
||||
s->willclose = 0;
|
||||
s->end_chunked_post = 0;
|
||||
s->end_header = 0;
|
||||
@@ -1167,6 +1168,34 @@ static int http_buf_read(URLContext *h, uint8_t *buf, int size)
|
||||
{
|
||||
HTTPContext *s = h->priv_data;
|
||||
int len;
|
||||
|
||||
if (s->chunksize != UINT64_MAX) {
|
||||
if (!s->chunksize) {
|
||||
char line[32];
|
||||
int err;
|
||||
|
||||
do {
|
||||
if ((err = http_get_line(s, line, sizeof(line))) < 0)
|
||||
return err;
|
||||
} while (!*line); /* skip CR LF from last chunk */
|
||||
|
||||
s->chunksize = strtoull(line, NULL, 16);
|
||||
|
||||
av_log(h, AV_LOG_TRACE,
|
||||
"Chunked encoding data size: %"PRIu64"'\n",
|
||||
s->chunksize);
|
||||
|
||||
if (!s->chunksize)
|
||||
return 0;
|
||||
else if (s->chunksize == UINT64_MAX) {
|
||||
av_log(h, AV_LOG_ERROR, "Invalid chunk size %"PRIu64"\n",
|
||||
s->chunksize);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
}
|
||||
size = FFMIN(size, s->chunksize);
|
||||
}
|
||||
|
||||
/* read bytes from input buffer first */
|
||||
len = s->buf_end - s->buf_ptr;
|
||||
if (len > 0) {
|
||||
@@ -1175,15 +1204,13 @@ static int http_buf_read(URLContext *h, uint8_t *buf, int size)
|
||||
memcpy(buf, s->buf_ptr, len);
|
||||
s->buf_ptr += len;
|
||||
} else {
|
||||
int64_t target_end = s->end_off ? s->end_off : s->filesize;
|
||||
if ((!s->willclose || s->chunksize < 0) &&
|
||||
target_end >= 0 && s->off >= target_end)
|
||||
uint64_t target_end = s->end_off ? s->end_off : s->filesize;
|
||||
if ((!s->willclose || s->chunksize == UINT64_MAX) && s->off >= target_end)
|
||||
return AVERROR_EOF;
|
||||
len = ffurl_read(s->hd, buf, size);
|
||||
if (!len && (!s->willclose || s->chunksize < 0) &&
|
||||
target_end >= 0 && s->off < target_end) {
|
||||
if (!len && (!s->willclose || s->chunksize == UINT64_MAX) && s->off < target_end) {
|
||||
av_log(h, AV_LOG_ERROR,
|
||||
"Stream ends prematurely at %"PRId64", should be %"PRId64"\n",
|
||||
"Stream ends prematurely at %"PRIu64", should be %"PRIu64"\n",
|
||||
s->off, target_end
|
||||
);
|
||||
return AVERROR(EIO);
|
||||
@@ -1191,8 +1218,10 @@ static int http_buf_read(URLContext *h, uint8_t *buf, int size)
|
||||
}
|
||||
if (len > 0) {
|
||||
s->off += len;
|
||||
if (s->chunksize > 0)
|
||||
if (s->chunksize > 0) {
|
||||
av_assert0(s->chunksize >= len);
|
||||
s->chunksize -= len;
|
||||
}
|
||||
}
|
||||
return len;
|
||||
}
|
||||
@@ -1247,25 +1276,6 @@ static int http_read_stream(URLContext *h, uint8_t *buf, int size)
|
||||
return err;
|
||||
}
|
||||
|
||||
if (s->chunksize >= 0) {
|
||||
if (!s->chunksize) {
|
||||
char line[32];
|
||||
|
||||
do {
|
||||
if ((err = http_get_line(s, line, sizeof(line))) < 0)
|
||||
return err;
|
||||
} while (!*line); /* skip CR LF from last chunk */
|
||||
|
||||
s->chunksize = strtoll(line, NULL, 16);
|
||||
|
||||
av_log(NULL, AV_LOG_TRACE, "Chunked encoding data size: %"PRId64"'\n",
|
||||
s->chunksize);
|
||||
|
||||
if (!s->chunksize)
|
||||
return 0;
|
||||
}
|
||||
size = FFMIN(size, s->chunksize);
|
||||
}
|
||||
#if CONFIG_ZLIB
|
||||
if (s->compressed)
|
||||
return http_buf_read_compressed(h, buf, size);
|
||||
@@ -1273,17 +1283,17 @@ static int http_read_stream(URLContext *h, uint8_t *buf, int size)
|
||||
read_ret = http_buf_read(h, buf, size);
|
||||
if ( (read_ret < 0 && s->reconnect && (!h->is_streamed || s->reconnect_streamed) && s->filesize > 0 && s->off < s->filesize)
|
||||
|| (read_ret == 0 && s->reconnect_at_eof && (!h->is_streamed || s->reconnect_streamed))) {
|
||||
int64_t target = h->is_streamed ? 0 : s->off;
|
||||
uint64_t target = h->is_streamed ? 0 : s->off;
|
||||
|
||||
if (s->reconnect_delay > s->reconnect_delay_max)
|
||||
return AVERROR(EIO);
|
||||
|
||||
av_log(h, AV_LOG_INFO, "Will reconnect at %"PRId64" error=%s.\n", s->off, av_err2str(read_ret));
|
||||
av_log(h, AV_LOG_INFO, "Will reconnect at %"PRIu64" error=%s.\n", s->off, av_err2str(read_ret));
|
||||
av_usleep(1000U*1000*s->reconnect_delay);
|
||||
s->reconnect_delay = 1 + 2*s->reconnect_delay;
|
||||
seek_ret = http_seek_internal(h, target, SEEK_SET, 1);
|
||||
if (seek_ret != target) {
|
||||
av_log(h, AV_LOG_ERROR, "Failed to reconnect at %"PRId64".\n", target);
|
||||
av_log(h, AV_LOG_ERROR, "Failed to reconnect at %"PRIu64".\n", target);
|
||||
return read_ret;
|
||||
}
|
||||
|
||||
@@ -1338,10 +1348,11 @@ static int store_icy(URLContext *h, int size)
|
||||
{
|
||||
HTTPContext *s = h->priv_data;
|
||||
/* until next metadata packet */
|
||||
int remaining = s->icy_metaint - s->icy_data_read;
|
||||
uint64_t remaining;
|
||||
|
||||
if (remaining < 0)
|
||||
if (s->icy_metaint < s->icy_data_read)
|
||||
return AVERROR_INVALIDDATA;
|
||||
remaining = s->icy_metaint - s->icy_data_read;
|
||||
|
||||
if (!remaining) {
|
||||
/* The metadata packet is variable sized. It has a 1 byte header
|
||||
@@ -1455,7 +1466,7 @@ static int64_t http_seek_internal(URLContext *h, int64_t off, int whence, int fo
|
||||
{
|
||||
HTTPContext *s = h->priv_data;
|
||||
URLContext *old_hd = s->hd;
|
||||
int64_t old_off = s->off;
|
||||
uint64_t old_off = s->off;
|
||||
uint8_t old_buf[BUFFER_SIZE];
|
||||
int old_buf_size, ret;
|
||||
AVDictionary *options = NULL;
|
||||
@@ -1466,7 +1477,7 @@ static int64_t http_seek_internal(URLContext *h, int64_t off, int whence, int fo
|
||||
((whence == SEEK_CUR && off == 0) ||
|
||||
(whence == SEEK_SET && off == s->off)))
|
||||
return s->off;
|
||||
else if ((s->filesize == -1 && whence == SEEK_END))
|
||||
else if ((s->filesize == UINT64_MAX && whence == SEEK_END))
|
||||
return AVERROR(ENOSYS);
|
||||
|
||||
if (whence == SEEK_CUR)
|
||||
@@ -1621,7 +1632,7 @@ redo:
|
||||
s->buf_ptr = s->buffer;
|
||||
s->buf_end = s->buffer;
|
||||
s->line_count = 0;
|
||||
s->filesize = -1;
|
||||
s->filesize = UINT64_MAX;
|
||||
cur_auth_type = s->proxy_auth_state.auth_type;
|
||||
|
||||
/* Note: This uses buffering, potentially reading more than the
|
||||
|
||||
@@ -157,6 +157,9 @@ static int roq_read_packet(AVFormatContext *s,
|
||||
chunk_size = AV_RL32(&preamble[2]) + RoQ_CHUNK_PREAMBLE_SIZE * 2 +
|
||||
codebook_size;
|
||||
|
||||
if (chunk_size > INT_MAX)
|
||||
return AVERROR_INVALIDDATA;
|
||||
|
||||
/* rewind */
|
||||
avio_seek(pb, codebook_offset, SEEK_SET);
|
||||
|
||||
|
||||
@@ -82,6 +82,11 @@ static int read_header_openmpt(AVFormatContext *s)
|
||||
if (!buf)
|
||||
return AVERROR(ENOMEM);
|
||||
size = avio_read(s->pb, buf, size);
|
||||
if (size < 0) {
|
||||
av_log(s, AV_LOG_ERROR, "Reading input buffer failed.\n");
|
||||
av_freep(&buf);
|
||||
return size;
|
||||
}
|
||||
|
||||
openmpt->module = openmpt_module_create_from_memory(buf, size, openmpt_logfunc, s, NULL);
|
||||
av_freep(&buf);
|
||||
|
||||
@@ -88,6 +88,7 @@ typedef const struct EbmlSyntax {
|
||||
int list_elem_size;
|
||||
int data_offset;
|
||||
union {
|
||||
int64_t i;
|
||||
uint64_t u;
|
||||
double f;
|
||||
const char *s;
|
||||
@@ -676,7 +677,7 @@ static const EbmlSyntax matroska_blockgroup[] = {
|
||||
{ MATROSKA_ID_SIMPLEBLOCK, EBML_BIN, 0, offsetof(MatroskaBlock, bin) },
|
||||
{ MATROSKA_ID_BLOCKDURATION, EBML_UINT, 0, offsetof(MatroskaBlock, duration) },
|
||||
{ MATROSKA_ID_DISCARDPADDING, EBML_SINT, 0, offsetof(MatroskaBlock, discard_padding) },
|
||||
{ MATROSKA_ID_BLOCKREFERENCE, EBML_SINT, 0, offsetof(MatroskaBlock, reference) },
|
||||
{ MATROSKA_ID_BLOCKREFERENCE, EBML_SINT, 0, offsetof(MatroskaBlock, reference), { .i = INT64_MIN } },
|
||||
{ MATROSKA_ID_CODECSTATE, EBML_NONE },
|
||||
{ 1, EBML_UINT, 0, offsetof(MatroskaBlock, non_simple), { .u = 1 } },
|
||||
{ 0 }
|
||||
@@ -1051,6 +1052,9 @@ static int ebml_parse_nest(MatroskaDemuxContext *matroska, EbmlSyntax *syntax,
|
||||
|
||||
for (i = 0; syntax[i].id; i++)
|
||||
switch (syntax[i].type) {
|
||||
case EBML_SINT:
|
||||
*(int64_t *) ((char *) data + syntax[i].data_offset) = syntax[i].def.i;
|
||||
break;
|
||||
case EBML_UINT:
|
||||
*(uint64_t *) ((char *) data + syntax[i].data_offset) = syntax[i].def.u;
|
||||
break;
|
||||
@@ -3289,7 +3293,7 @@ static int matroska_parse_cluster_incremental(MatroskaDemuxContext *matroska)
|
||||
matroska->current_cluster_num_blocks = blocks_list->nb_elem;
|
||||
i = blocks_list->nb_elem - 1;
|
||||
if (blocks[i].bin.size > 0 && blocks[i].bin.data) {
|
||||
int is_keyframe = blocks[i].non_simple ? !blocks[i].reference : -1;
|
||||
int is_keyframe = blocks[i].non_simple ? blocks[i].reference == INT64_MIN : -1;
|
||||
uint8_t* additional = blocks[i].additional.size > 0 ?
|
||||
blocks[i].additional.data : NULL;
|
||||
if (!blocks[i].non_simple)
|
||||
@@ -3327,7 +3331,7 @@ static int matroska_parse_cluster(MatroskaDemuxContext *matroska)
|
||||
blocks = blocks_list->elem;
|
||||
for (i = 0; i < blocks_list->nb_elem; i++)
|
||||
if (blocks[i].bin.size > 0 && blocks[i].bin.data) {
|
||||
int is_keyframe = blocks[i].non_simple ? !blocks[i].reference : -1;
|
||||
int is_keyframe = blocks[i].non_simple ? blocks[i].reference == INT64_MIN : -1;
|
||||
res = matroska_parse_block(matroska, blocks[i].bin.data,
|
||||
blocks[i].bin.size, blocks[i].bin.pos,
|
||||
cluster.timecode, blocks[i].duration,
|
||||
|
||||
+12
-5
@@ -404,11 +404,11 @@ retry:
|
||||
return ret;
|
||||
} else if (!key && c->found_hdlr_mdta && c->meta_keys) {
|
||||
uint32_t index = AV_RB32(&atom.type);
|
||||
if (index < c->meta_keys_count) {
|
||||
if (index < c->meta_keys_count && index > 0) {
|
||||
key = c->meta_keys[index];
|
||||
} else {
|
||||
av_log(c->fc, AV_LOG_WARNING,
|
||||
"The index of 'data' is out of range: %d >= %d.\n",
|
||||
"The index of 'data' is out of range: %d < 1 or >= %d.\n",
|
||||
index, c->meta_keys_count);
|
||||
}
|
||||
}
|
||||
@@ -739,6 +739,8 @@ static int mov_read_hdlr(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
|
||||
title_size = atom.size - 24;
|
||||
if (title_size > 0) {
|
||||
if (title_size > FFMIN(INT_MAX, SIZE_MAX-1))
|
||||
return AVERROR_INVALIDDATA;
|
||||
title_str = av_malloc(title_size + 1); /* Add null terminator */
|
||||
if (!title_str)
|
||||
return AVERROR(ENOMEM);
|
||||
@@ -4434,7 +4436,7 @@ static int mov_read_uuid(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
0x9c, 0x71, 0x99, 0x94, 0x91, 0xe3, 0xaf, 0xac
|
||||
};
|
||||
|
||||
if (atom.size < sizeof(uuid) || atom.size == INT64_MAX)
|
||||
if (atom.size < sizeof(uuid) || atom.size >= FFMIN(INT_MAX, SIZE_MAX))
|
||||
return AVERROR_INVALIDDATA;
|
||||
|
||||
ret = avio_read(pb, uuid, sizeof(uuid));
|
||||
@@ -4597,8 +4599,8 @@ static int mov_read_senc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
|
||||
avio_rb32(pb); /* entries */
|
||||
|
||||
if (atom.size < 8) {
|
||||
av_log(c->fc, AV_LOG_ERROR, "senc atom size %"PRId64" too small\n", atom.size);
|
||||
if (atom.size < 8 || atom.size > FFMIN(INT_MAX, SIZE_MAX)) {
|
||||
av_log(c->fc, AV_LOG_ERROR, "senc atom size %"PRId64" invalid\n", atom.size);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
@@ -4666,6 +4668,11 @@ static int mov_read_saiz(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (atom.size > FFMIN(INT_MAX, SIZE_MAX)) {
|
||||
av_log(c->fc, AV_LOG_ERROR, "saiz atom auxiliary_info_sizes size %"PRId64" invalid\n", atom.size);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
/* save the auxiliary info sizes as is */
|
||||
data_size = atom.size - atom_header_size;
|
||||
|
||||
|
||||
@@ -457,7 +457,8 @@ static int check(AVIOContext *pb, int64_t pos, uint32_t *ret_header)
|
||||
return CHECK_SEEK_FAILED;
|
||||
|
||||
ret = avio_read(pb, &header_buf[0], 4);
|
||||
if (ret < 0)
|
||||
/* We should always find four bytes for a valid mpa header. */
|
||||
if (ret < 4)
|
||||
return CHECK_SEEK_FAILED;
|
||||
|
||||
header = AV_RB32(&header_buf[0]);
|
||||
|
||||
@@ -643,6 +643,8 @@ static int ogg_get_length(AVFormatContext *s)
|
||||
int64_t pts;
|
||||
if (i < 0) continue;
|
||||
pts = ogg_calc_pts(s, i, NULL);
|
||||
if (s->streams[i]->duration == AV_NOPTS_VALUE)
|
||||
continue;
|
||||
if (pts != AV_NOPTS_VALUE && s->streams[i]->start_time == AV_NOPTS_VALUE && !ogg->streams[i].got_start) {
|
||||
s->streams[i]->duration -= pts;
|
||||
ogg->streams[i].got_start= 1;
|
||||
|
||||
@@ -78,6 +78,13 @@ static int speex_header(AVFormatContext *s, int idx) {
|
||||
|
||||
spxp->packet_size = AV_RL32(p + 56);
|
||||
frames_per_packet = AV_RL32(p + 64);
|
||||
if (spxp->packet_size < 0 ||
|
||||
frames_per_packet < 0 ||
|
||||
spxp->packet_size * (int64_t)frames_per_packet > INT32_MAX / 256) {
|
||||
av_log(s, AV_LOG_ERROR, "invalid packet_size, frames_per_packet %d %d\n", spxp->packet_size, frames_per_packet);
|
||||
spxp->packet_size = 0;
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
if (frames_per_packet)
|
||||
spxp->packet_size *= frames_per_packet;
|
||||
|
||||
|
||||
@@ -105,6 +105,7 @@ static const AVOption avformat_options[] = {
|
||||
{"format_whitelist", "List of demuxers that are allowed to be used", OFFSET(format_whitelist), AV_OPT_TYPE_STRING, { .str = NULL }, CHAR_MIN, CHAR_MAX, D },
|
||||
{"protocol_whitelist", "List of protocols that are allowed to be used", OFFSET(protocol_whitelist), AV_OPT_TYPE_STRING, { .str = NULL }, CHAR_MIN, CHAR_MAX, D },
|
||||
{"protocol_blacklist", "List of protocols that are not allowed to be used", OFFSET(protocol_blacklist), AV_OPT_TYPE_STRING, { .str = NULL }, CHAR_MIN, CHAR_MAX, D },
|
||||
{"max_streams", "maximum number of streams", OFFSET(max_streams), AV_OPT_TYPE_INT, { .i64 = 1000 }, 0, INT_MAX, D },
|
||||
{NULL},
|
||||
};
|
||||
|
||||
|
||||
@@ -235,6 +235,14 @@ static int rtmp_packet_read_one_chunk(URLContext *h, RTMPPacket *p,
|
||||
if (hdr != RTMP_PS_TWELVEBYTES)
|
||||
timestamp += prev_pkt[channel_id].timestamp;
|
||||
|
||||
if (prev_pkt[channel_id].read && size != prev_pkt[channel_id].size) {
|
||||
av_log(NULL, AV_LOG_ERROR, "RTMP packet size mismatch %d != %d\n",
|
||||
size,
|
||||
prev_pkt[channel_id].size);
|
||||
ff_rtmp_packet_destroy(&prev_pkt[channel_id]);
|
||||
prev_pkt[channel_id].read = 0;
|
||||
}
|
||||
|
||||
if (!prev_pkt[channel_id].read) {
|
||||
if ((ret = ff_rtmp_packet_create(p, channel_id, type, timestamp,
|
||||
size)) < 0)
|
||||
|
||||
+11
-5
@@ -1980,7 +1980,7 @@ int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,
|
||||
m = (a + b) >> 1;
|
||||
|
||||
// Search for the next non-discarded packet.
|
||||
while ((entries[m].flags & AVINDEX_DISCARD_FRAME) && m < b) {
|
||||
while ((entries[m].flags & AVINDEX_DISCARD_FRAME) && m < b && m < nb_entries - 1) {
|
||||
m++;
|
||||
if (m == b && entries[m].timestamp >= wanted_timestamp) {
|
||||
m = b - 1;
|
||||
@@ -2597,11 +2597,14 @@ static void update_stream_timings(AVFormatContext *ic)
|
||||
if (ic->nb_programs > 1) {
|
||||
for (i = 0; i < ic->nb_programs; i++) {
|
||||
p = ic->programs[i];
|
||||
if (p->start_time != AV_NOPTS_VALUE && p->end_time > p->start_time)
|
||||
if (p->start_time != AV_NOPTS_VALUE &&
|
||||
p->end_time > p->start_time &&
|
||||
p->end_time - (uint64_t)p->start_time <= INT64_MAX)
|
||||
duration = FFMAX(duration, p->end_time - p->start_time);
|
||||
}
|
||||
} else
|
||||
} else if (end_time >= start_time && end_time - (uint64_t)start_time <= INT64_MAX) {
|
||||
duration = FFMAX(duration, end_time - start_time);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (duration != INT64_MIN && duration > 0 && ic->duration == AV_NOPTS_VALUE) {
|
||||
@@ -3361,7 +3364,7 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
|
||||
int64_t max_subtitle_analyze_duration;
|
||||
int64_t probesize = ic->probesize;
|
||||
int eof_reached = 0;
|
||||
int64_t *missing_streams = av_opt_ptr(ic->iformat->priv_class, ic->priv_data, "missing_streams");
|
||||
int *missing_streams = av_opt_ptr(ic->iformat->priv_class, ic->priv_data, "missing_streams");
|
||||
|
||||
flush_codecs = probesize > 0;
|
||||
|
||||
@@ -4210,8 +4213,11 @@ AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c)
|
||||
int i;
|
||||
AVStream **streams;
|
||||
|
||||
if (s->nb_streams >= INT_MAX/sizeof(*streams))
|
||||
if (s->nb_streams >= FFMIN(s->max_streams, INT_MAX/sizeof(*streams))) {
|
||||
if (s->max_streams < INT_MAX/sizeof(*streams))
|
||||
av_log(s, AV_LOG_ERROR, "Number of streams exceeds max_streams parameter (%d), see the documentation if you wish to increase it\n", s->max_streams);
|
||||
return NULL;
|
||||
}
|
||||
streams = av_realloc_array(s->streams, s->nb_streams + 1, sizeof(*streams));
|
||||
if (!streams)
|
||||
return NULL;
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
// Also please add any ticket numbers that you believe might be affected here
|
||||
#define LIBAVFORMAT_VERSION_MAJOR 57
|
||||
#define LIBAVFORMAT_VERSION_MINOR 56
|
||||
#define LIBAVFORMAT_VERSION_MICRO 100
|
||||
#define LIBAVFORMAT_VERSION_MICRO 101
|
||||
|
||||
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
|
||||
LIBAVFORMAT_VERSION_MINOR, \
|
||||
|
||||
+24
-5
@@ -248,19 +248,38 @@ static const AVClass imgutils_class = {
|
||||
.parent_log_context_offset = offsetof(ImgUtils, log_ctx),
|
||||
};
|
||||
|
||||
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
|
||||
int av_image_check_size2(unsigned int w, unsigned int h, int64_t max_pixels, enum AVPixelFormat pix_fmt, int log_offset, void *log_ctx)
|
||||
{
|
||||
ImgUtils imgutils = {
|
||||
.class = &imgutils_class,
|
||||
.log_offset = log_offset,
|
||||
.log_ctx = log_ctx,
|
||||
};
|
||||
int64_t stride = av_image_get_linesize(pix_fmt, w, 0);
|
||||
if (stride <= 0)
|
||||
stride = 8LL*w;
|
||||
stride += 128*8;
|
||||
|
||||
if ((int)w>0 && (int)h>0 && (w+128)*(uint64_t)(h+128) < INT_MAX/8)
|
||||
return 0;
|
||||
if ((int)w<=0 || (int)h<=0 || stride >= INT_MAX || stride*(uint64_t)(h+128) >= INT_MAX) {
|
||||
av_log(&imgutils, AV_LOG_ERROR, "Picture size %ux%u is invalid\n", w, h);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
av_log(&imgutils, AV_LOG_ERROR, "Picture size %ux%u is invalid\n", w, h);
|
||||
return AVERROR(EINVAL);
|
||||
if (max_pixels < INT64_MAX) {
|
||||
if (w*(int64_t)h > max_pixels) {
|
||||
av_log(&imgutils, AV_LOG_ERROR,
|
||||
"Picture size %ux%u exceeds specified max pixel count %"PRId64", see the documentation if you wish to increase it\n",
|
||||
w, h, max_pixels);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
|
||||
{
|
||||
return av_image_check_size2(w, h, INT64_MAX, AV_PIX_FMT_NONE, log_offset, log_ctx);
|
||||
}
|
||||
|
||||
int av_image_check_sar(unsigned int w, unsigned int h, AVRational sar)
|
||||
|
||||
@@ -191,6 +191,20 @@ int av_image_copy_to_buffer(uint8_t *dst, int dst_size,
|
||||
*/
|
||||
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx);
|
||||
|
||||
/**
|
||||
* Check if the given dimension of an image is valid, meaning that all
|
||||
* bytes of the image can be addressed with a signed int.
|
||||
*
|
||||
* @param w the width of the picture
|
||||
* @param h the height of the picture
|
||||
* @param max_pixels the maximum number of pixels the user wants to accept
|
||||
* @param pix_fmt the pixel format, can be AV_PIX_FMT_NONE if unknown.
|
||||
* @param log_offset the offset to sum to the log level for logging with log_ctx
|
||||
* @param log_ctx the parent logging context, it may be NULL
|
||||
* @return >= 0 if valid, a negative error code otherwise
|
||||
*/
|
||||
int av_image_check_size2(unsigned int w, unsigned int h, int64_t max_pixels, enum AVPixelFormat pix_fmt, int log_offset, void *log_ctx);
|
||||
|
||||
/**
|
||||
* Check if the given sample aspect ratio of an image is valid.
|
||||
*
|
||||
|
||||
@@ -67,6 +67,7 @@ static uint32_t get_generic_seed(void)
|
||||
uint8_t tmp[120];
|
||||
struct AVSHA *sha = (void*)tmp;
|
||||
clock_t last_t = 0;
|
||||
clock_t last_td = 0;
|
||||
static uint64_t i = 0;
|
||||
static uint32_t buffer[512] = { 0 };
|
||||
unsigned char digest[20];
|
||||
@@ -86,11 +87,12 @@ static uint32_t get_generic_seed(void)
|
||||
|
||||
for (;;) {
|
||||
clock_t t = clock();
|
||||
|
||||
if (last_t == t) {
|
||||
buffer[i & 511]++;
|
||||
if (last_t + 2*last_td + (CLOCKS_PER_SEC > 1000) >= t) {
|
||||
last_td = t - last_t;
|
||||
buffer[i & 511] = 1664525*buffer[i & 511] + 1013904223 + (last_td % 3294638521U);
|
||||
} else {
|
||||
buffer[++i & 511] += (t - last_t) % 3294638521U;
|
||||
last_td = t - last_t;
|
||||
buffer[++i & 511] += last_td % 3294638521U;
|
||||
if (last_i && i - last_i > 4 || i - last_i > 64 || TEST && i - last_i > 8)
|
||||
break;
|
||||
}
|
||||
|
||||
+1
-1
@@ -80,7 +80,7 @@
|
||||
|
||||
#define LIBAVUTIL_VERSION_MAJOR 55
|
||||
#define LIBAVUTIL_VERSION_MINOR 34
|
||||
#define LIBAVUTIL_VERSION_MICRO 100
|
||||
#define LIBAVUTIL_VERSION_MICRO 101
|
||||
|
||||
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
|
||||
LIBAVUTIL_VERSION_MINOR, \
|
||||
|
||||
@@ -762,10 +762,8 @@ int attribute_align_arg sws_scale(struct SwsContext *c,
|
||||
uint8_t *rgb0_tmp = NULL;
|
||||
int macro_height = isBayer(c->srcFormat) ? 2 : (1 << c->chrSrcVSubSample);
|
||||
// copy strides, so they can safely be modified
|
||||
int srcStride2[4] = { srcStride[0], srcStride[1], srcStride[2],
|
||||
srcStride[3] };
|
||||
int dstStride2[4] = { dstStride[0], dstStride[1], dstStride[2],
|
||||
dstStride[3] };
|
||||
int srcStride2[4];
|
||||
int dstStride2[4];
|
||||
int srcSliceY_internal = srcSliceY;
|
||||
|
||||
if (!srcStride || !dstStride || !dst || !srcSlice) {
|
||||
@@ -773,6 +771,11 @@ int attribute_align_arg sws_scale(struct SwsContext *c,
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i=0; i<4; i++) {
|
||||
srcStride2[i] = srcStride[i];
|
||||
dstStride2[i] = dstStride[i];
|
||||
}
|
||||
|
||||
if ((srcSliceY & (macro_height-1)) ||
|
||||
((srcSliceH& (macro_height-1)) && srcSliceY + srcSliceH != c->srcH) ||
|
||||
srcSliceY + srcSliceH > c->srcH) {
|
||||
|
||||
@@ -199,7 +199,7 @@ void ff_hyscale_fast_mmxext(SwsContext *c, int16_t *dst,
|
||||
#if ARCH_X86_64
|
||||
uint64_t retsave;
|
||||
#else
|
||||
#if defined(PIC)
|
||||
#if !HAVE_EBX_AVAILABLE
|
||||
uint64_t ebxsave;
|
||||
#endif
|
||||
#endif
|
||||
@@ -209,7 +209,7 @@ void ff_hyscale_fast_mmxext(SwsContext *c, int16_t *dst,
|
||||
"mov -8(%%rsp), %%"FF_REG_a" \n\t"
|
||||
"mov %%"FF_REG_a", %5 \n\t" // retsave
|
||||
#else
|
||||
#if defined(PIC)
|
||||
#if !HAVE_EBX_AVAILABLE
|
||||
"mov %%"FF_REG_b", %5 \n\t" // ebxsave
|
||||
#endif
|
||||
#endif
|
||||
@@ -255,7 +255,7 @@ void ff_hyscale_fast_mmxext(SwsContext *c, int16_t *dst,
|
||||
"mov %5, %%"FF_REG_a" \n\t"
|
||||
"mov %%"FF_REG_a", -8(%%rsp) \n\t"
|
||||
#else
|
||||
#if defined(PIC)
|
||||
#if !HAVE_EBX_AVAILABLE
|
||||
"mov %5, %%"FF_REG_b" \n\t"
|
||||
#endif
|
||||
#endif
|
||||
@@ -264,12 +264,12 @@ void ff_hyscale_fast_mmxext(SwsContext *c, int16_t *dst,
|
||||
#if ARCH_X86_64
|
||||
,"m"(retsave)
|
||||
#else
|
||||
#if defined(PIC)
|
||||
#if !HAVE_EBX_AVAILABLE
|
||||
,"m" (ebxsave)
|
||||
#endif
|
||||
#endif
|
||||
: "%"FF_REG_a, "%"FF_REG_c, "%"FF_REG_d, "%"FF_REG_S, "%"FF_REG_D
|
||||
#if ARCH_X86_64 || !defined(PIC)
|
||||
#if ARCH_X86_64 || HAVE_EBX_AVAILABLE
|
||||
,"%"FF_REG_b
|
||||
#endif
|
||||
);
|
||||
@@ -289,7 +289,7 @@ void ff_hcscale_fast_mmxext(SwsContext *c, int16_t *dst1, int16_t *dst2,
|
||||
#if ARCH_X86_64
|
||||
DECLARE_ALIGNED(8, uint64_t, retsave);
|
||||
#else
|
||||
#if defined(PIC)
|
||||
#if !HAVE_EBX_AVAILABLE
|
||||
DECLARE_ALIGNED(8, uint64_t, ebxsave);
|
||||
#endif
|
||||
#endif
|
||||
@@ -298,7 +298,7 @@ void ff_hcscale_fast_mmxext(SwsContext *c, int16_t *dst1, int16_t *dst2,
|
||||
"mov -8(%%rsp), %%"FF_REG_a" \n\t"
|
||||
"mov %%"FF_REG_a", %7 \n\t" // retsave
|
||||
#else
|
||||
#if defined(PIC)
|
||||
#if !HAVE_EBX_AVAILABLE
|
||||
"mov %%"FF_REG_b", %7 \n\t" // ebxsave
|
||||
#endif
|
||||
#endif
|
||||
@@ -332,7 +332,7 @@ void ff_hcscale_fast_mmxext(SwsContext *c, int16_t *dst1, int16_t *dst2,
|
||||
"mov %7, %%"FF_REG_a" \n\t"
|
||||
"mov %%"FF_REG_a", -8(%%rsp) \n\t"
|
||||
#else
|
||||
#if defined(PIC)
|
||||
#if !HAVE_EBX_AVAILABLE
|
||||
"mov %7, %%"FF_REG_b" \n\t"
|
||||
#endif
|
||||
#endif
|
||||
@@ -341,12 +341,12 @@ void ff_hcscale_fast_mmxext(SwsContext *c, int16_t *dst1, int16_t *dst2,
|
||||
#if ARCH_X86_64
|
||||
,"m"(retsave)
|
||||
#else
|
||||
#if defined(PIC)
|
||||
#if !HAVE_EBX_AVAILABLE
|
||||
,"m" (ebxsave)
|
||||
#endif
|
||||
#endif
|
||||
: "%"FF_REG_a, "%"FF_REG_c, "%"FF_REG_d, "%"FF_REG_S, "%"FF_REG_D
|
||||
#if ARCH_X86_64 || !defined(PIC)
|
||||
#if ARCH_X86_64 || HAVE_EBX_AVAILABLE
|
||||
,"%"FF_REG_b
|
||||
#endif
|
||||
);
|
||||
|
||||
+1
-1
@@ -53,7 +53,7 @@ int main(int argc, char **argv)
|
||||
{
|
||||
AVBPrint src;
|
||||
char c, *src_buf, *recv_buf;
|
||||
int recv_buf_size, ret;
|
||||
int recv_buf_size, ret = 0;
|
||||
void *zmq_ctx, *socket;
|
||||
const char *bind_address = "tcp://localhost:5555";
|
||||
const char *infilename = NULL;
|
||||
|
||||
Reference in New Issue
Block a user