Compare commits

...

21 Commits

Author SHA1 Message Date
Michael Niedermayer
243396f06d update for 0.6.7
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2013-09-23 01:23:35 +02:00
Michael Niedermayer
c7ab9de727 avcodec/ffv1enc: update buffer check for 16bps
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
(cherry picked from commit 3728603f18)

Conflicts:

	libavcodec/ffv1enc.c
(cherry picked from commit c900c6e5c26cd86cf34f9c8d4347cedbd01f3935)
2013-09-09 20:51:01 +02:00
Michael Niedermayer
b51c4df35b avcodec/dsputil: fix signedness in sizeof() comparissions
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
(cherry picked from commit 454a11a1c9)

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2013-08-30 23:49:16 +02:00
Michael Niedermayer
f9225c2884 matroska_read_seek: Fix used streams for subtitle index compensation
Might fix Ticket1907 (I have no testcase so i cant test)

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
(cherry picked from commit 4758e32a6c)

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2013-08-29 03:00:40 +02:00
Michael Niedermayer
6ad4a116a2 avcodec/rpza: Perform pointer advance and checks before using the pointers
Fixes out of array accesses
Fixes Ticket2850

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
(cherry picked from commit 3819db745d)

Conflicts:

	libavcodec/rpza.c
(cherry picked from commit edba432b8b01d68c22e70a508f47553359f59fb5)

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2013-08-22 01:44:29 +02:00
Diego Biurrun
3f785a538b configure: Make warnings from -Wreturn-type fatal errors
These warnings have no false positives and point to serious bugs.
(cherry picked from commit 99853cb8d4)

Conflicts:

	configure

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2013-02-19 00:56:54 +01:00
Michael Niedermayer
a77cf47d88 huffyuvdec: Skip len==0 cases
Fixes vlc decoding for hypothetical files that would contain such cases.

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
(cherry picked from commit 0dfc01c2bb)

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
(cherry picked from commit 5ff41ffeb4cb9ea6df49757dc859619dc3d3ab4f)

Conflicts:

	libavcodec/huffyuv.c
(cherry picked from commit 9bc70fe1ae50fd2faa0b9429d47cfbda01a92ebc)

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2013-01-29 19:29:05 +01:00
Michael Niedermayer
a7faa1d070 huffyuvdec: Check init_vlc() return codes.
Prevents out of array writes

Found-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
(cherry picked from commit f67a0d1152)

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
(cherry picked from commit 95ab8d33e1a680f30a5a9605175112008ab81afc)

Conflicts:

	libavcodec/huffyuv.c
(cherry picked from commit 277def59fce10d91e3113e5c0f63e22bc4abfa88)

Conflicts:

	libavcodec/huffyuv.c
(cherry picked from commit adf022f458d75e2c8041262e1906a249366ad518)

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2013-01-29 18:37:08 +01:00
Xi Wang
9aa60889f3 rtmp: fix buffer overflows in ff_amf_tag_contents()
A negative `size' will bypass FFMIN().  In the subsequent memcpy() call,
`size' will be considered as a large positive value, leading to a buffer
overflow.

Change the type of `size' to unsigned int to avoid buffer overflow, and
simplify overflow checks accordingly.

Signed-off-by: Xi Wang <xi.wang@gmail.com>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
(cherry picked from commit 4e692374f7)

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2013-01-23 05:55:32 +01:00
Xi Wang
636c42de19 rtmp: fix multiple broken overflow checks
Sanity checks like `data + size >= data_end || data + size < data' are
broken, because `data + size < data' assumes pointer overflow, which is
undefined behavior in C.  Many compilers such as gcc/clang optimize such
checks away.

Use `size < 0 || size >= data_end - data' instead.

Signed-off-by: Xi Wang <xi.wang@gmail.com>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
(cherry picked from commit 902cfe2f74)

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2013-01-23 05:55:30 +01:00
Michael Niedermayer
f48d1fb167 Merge remote-tracking branch 'qatar/release/0.6' into release/0.6
* qatar/release/0.6:
  vorbis: Validate that the floor 1 X values contain no duplicates.
  lavfi: avfilter_merge_formats: handle case where inputs are same
  mpegvideo: Don't use ff_mspel_motion() for vc1
  imgconvert: avoid undefined left shift in avcodec_find_best_pix_fmt
  nuv: check RTjpeg header for validity
  vc1dec: add flush function for WMV9 and VC-1 decoders
  mov: set AVCodecContext.width/height for h264
  h264: allow cropping to AVCodecContext.width/height

Merged-by: Michael Niedermayer <michaelni@gmx.at>
2012-10-16 18:00:02 +02:00
Alex Converse
0e2f415adf vorbis: Validate that the floor 1 X values contain no duplicates.
Duplicate values in this vector are explicitly banned by the Vorbis I spec
and cause divide-by-zero crashes later on.
(cherry picked from commit ecf79c4d3e)

Signed-off-by: Reinhard Tartler <siretart@tauware.de>
(cherry picked from commit 9aaaeba45c)

Signed-off-by: Anton Khirnov <anton@khirnov.net>
(cherry picked from commit d6e250abfc)

Signed-off-by: Anton Khirnov <anton@khirnov.net>
2012-10-06 09:47:41 +02:00
Mina Nagy Zaki
a4e277312c lavfi: avfilter_merge_formats: handle case where inputs are same
This fixes a double-free crash if lists are the same due to the two
merge_ref() calls at the end of the (useless) merging that happens.

Signed-off-by: Anton Khirnov <anton@khirnov.net>
(cherry picked from commit 11b6a82412)

Conflicts:

	libavfilter/formats.c

Signed-off-by: Reinhard Tartler <siretart@tauware.de>
(cherry picked from commit e5f4e24942)

Signed-off-by: Anton Khirnov <anton@khirnov.net>
(cherry picked from commit b6c5848a1f)

Signed-off-by: Anton Khirnov <anton@khirnov.net>
2012-10-06 09:47:21 +02:00
Michael Niedermayer
c82ae85a8a mpegvideo: Don't use ff_mspel_motion() for vc1
Using ff_mspel_motion assumes that s (a MpegEncContext
poiinter) really is a Wmv2Context.

This fixes crashes in error resilience on vc1/wmv3 videos.

CC: libav-stable@libav.org
Signed-off-by: Martin Storsjö <martin@martin.st>
(cherry picked from commit 18f2d5cb9c)

Signed-off-by: Anton Khirnov <anton@khirnov.net>
(cherry picked from commit da0c457663)

Signed-off-by: Anton Khirnov <anton@khirnov.net>
(cherry picked from commit 899d95efe1)

Signed-off-by: Anton Khirnov <anton@khirnov.net>
2012-10-06 09:46:14 +02:00
Janne Grunau
fd7426ed89 imgconvert: avoid undefined left shift in avcodec_find_best_pix_fmt
CC: libav-stable@libav.org
(cherry picked from commit 39bb27bf79)

Signed-off-by: Anton Khirnov <anton@khirnov.net>
(cherry picked from commit 7a7229b52d)

Signed-off-by: Anton Khirnov <anton@khirnov.net>
(cherry picked from commit 8812b5f164)

Signed-off-by: Anton Khirnov <anton@khirnov.net>
2012-10-06 09:46:08 +02:00
Janne Grunau
459feb7cce nuv: check RTjpeg header for validity
CC: libav-stable@libav.org
(cherry picked from commit 859a579e9b)

Signed-off-by: Anton Khirnov <anton@khirnov.net>
(cherry picked from commit 6704522ca9)

Signed-off-by: Anton Khirnov <anton@khirnov.net>
(cherry picked from commit f31170d4e7)

Signed-off-by: Anton Khirnov <anton@khirnov.net>
2012-10-06 09:46:03 +02:00
Kostya Shishkov
aa41212767 vc1dec: add flush function for WMV9 and VC-1 decoders
CC: libav-stable@libav.org
(cherry picked from commit 4dc8c8386e)

Signed-off-by: Anton Khirnov <anton@khirnov.net>
(cherry picked from commit 02b7239462)

Conflicts:
	libavcodec/vc1dec.c

Signed-off-by: Anton Khirnov <anton@khirnov.net>
(cherry picked from commit 0173a7966b)

Signed-off-by: Anton Khirnov <anton@khirnov.net>
2012-10-06 09:45:49 +02:00
Carl Eugen Hoyos
7923490712 Fix muxing mjpeg in swf. 2012-09-13 09:26:55 +02:00
Ronald S. Bultje
371e221d63 dxva2: include dxva.h if found
Apparently, some build environments require dxva.h even for dxva2,
while others lack this header entirely.  Including it conditionally
allows building in both cases.

Signed-off-by: Martin Storsjö <martin@martin.st>
(cherry picked from commit fa84506177)

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2012-09-13 04:41:59 +02:00
Mans Rullgard
44e6cf3f75 mov: set AVCodecContext.width/height for h264
This is required for correct cropping of files from Canon
cameras.

Signed-off-by: Mans Rullgard <mans@mansr.com>
(cherry picked from commit 8aa93e9004)

Signed-off-by: Reinhard Tartler <siretart@tauware.de>
(cherry picked from commit 2fb4be9a99)

Signed-off-by: Reinhard Tartler <siretart@tauware.de>
(cherry picked from commit 0054d70f23)

Signed-off-by: Reinhard Tartler <siretart@tauware.de>
2012-06-10 11:24:14 +02:00
Mans Rullgard
4eea330a2a h264: allow cropping to AVCodecContext.width/height
Override the frame size from the SPS with AVCodecContext values
if the latter specify a size smaller by less than one macroblock.
This is required for correct cropping of MOV files from Canon cameras.

Signed-off-by: Mans Rullgard <mans@mansr.com>
(cherry picked from commit 30f515091c)

Conflicts:

	libavcodec/h264.c
(cherry picked from commit e1608014c5)

Signed-off-by: Reinhard Tartler <siretart@tauware.de>
(cherry picked from commit b102d5d97d)

Signed-off-by: Reinhard Tartler <siretart@tauware.de>
2012-06-10 09:54:47 +02:00
22 changed files with 90 additions and 44 deletions

View File

@@ -1 +1 @@
0.6.6 0.6.7

4
configure vendored
View File

@@ -1037,6 +1037,7 @@ HAVE_LIST="
dlfcn_h dlfcn_h
dlopen dlopen
dos_paths dos_paths
dxva_h
ebp_available ebp_available
ebx_available ebx_available
exp2 exp2
@@ -2543,6 +2544,7 @@ check_func_headers windows.h VirtualAlloc
check_header conio.h check_header conio.h
check_header dlfcn.h check_header dlfcn.h
check_header dxva.h
check_header dxva2api.h check_header dxva2api.h
check_header malloc.h check_header malloc.h
check_header poll.h check_header poll.h
@@ -2794,8 +2796,10 @@ elif enabled gcc; then
check_cflags -fno-tree-vectorize check_cflags -fno-tree-vectorize
check_cflags -Werror=implicit check_cflags -Werror=implicit
check_cflags -Werror=missing-prototypes check_cflags -Werror=missing-prototypes
check_cflags -Werror=return-type
elif enabled clang; then elif enabled clang; then
check_cflags -Qunused-arguments check_cflags -Qunused-arguments
check_cflags -Werror=return-type
elif enabled armcc; then elif enabled armcc; then
# 2523: use of inline assembler is deprecated # 2523: use of inline assembler is deprecated
add_cflags -Wrvct,--diag_suppress=2523 add_cflags -Wrvct,--diag_suppress=2523

View File

@@ -3217,7 +3217,7 @@ static void clear_blocks_c(DCTELEM *blocks)
static void add_bytes_c(uint8_t *dst, uint8_t *src, int w){ static void add_bytes_c(uint8_t *dst, uint8_t *src, int w){
long i; long i;
for(i=0; i<=w-sizeof(long); i+=sizeof(long)){ for(i=0; i<=w-(int)sizeof(long); i+=sizeof(long)){
long a = *(long*)(src+i); long a = *(long*)(src+i);
long b = *(long*)(dst+i); long b = *(long*)(dst+i);
*(long*)(dst+i) = ((a&pb_7f) + (b&pb_7f)) ^ ((a^b)&pb_80); *(long*)(dst+i) = ((a&pb_7f) + (b&pb_7f)) ^ ((a^b)&pb_80);
@@ -3228,7 +3228,7 @@ static void add_bytes_c(uint8_t *dst, uint8_t *src, int w){
static void add_bytes_l2_c(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w){ static void add_bytes_l2_c(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w){
long i; long i;
for(i=0; i<=w-sizeof(long); i+=sizeof(long)){ for(i=0; i<=w-(int)sizeof(long); i+=sizeof(long)){
long a = *(long*)(src1+i); long a = *(long*)(src1+i);
long b = *(long*)(src2+i); long b = *(long*)(src2+i);
*(long*)(dst+i) = ((a&pb_7f) + (b&pb_7f)) ^ ((a^b)&pb_80); *(long*)(dst+i) = ((a&pb_7f) + (b&pb_7f)) ^ ((a^b)&pb_80);
@@ -3253,7 +3253,7 @@ static void diff_bytes_c(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w){
} }
}else }else
#endif #endif
for(i=0; i<=w-sizeof(long); i+=sizeof(long)){ for(i=0; i<=w-(int)sizeof(long); i+=sizeof(long)){
long a = *(long*)(src1+i); long a = *(long*)(src1+i);
long b = *(long*)(src2+i); long b = *(long*)(src2+i);
*(long*)(dst+i) = ((a|pb_80) - (b&pb_7f)) ^ ((a^b^pb_80)&pb_80); *(long*)(dst+i) = ((a|pb_80) - (b&pb_7f)) ^ ((a^b^pb_80)&pb_80);

View File

@@ -25,7 +25,14 @@
#define _WIN32_WINNT 0x0600 #define _WIN32_WINNT 0x0600
#define COBJMACROS #define COBJMACROS
#include "config.h"
#include "dxva2.h" #include "dxva2.h"
#if HAVE_DXVA_H
#include <dxva.h>
#endif
#include "avcodec.h" #include "avcodec.h"
#include "mpegvideo.h" #include "mpegvideo.h"

View File

@@ -437,7 +437,7 @@ static inline int encode_line(FFV1Context *s, int w, int_fast16_t *sample[2], in
int run_mode=0; int run_mode=0;
if(s->ac){ if(s->ac){
if(c->bytestream_end - c->bytestream < w*20){ if(c->bytestream_end - c->bytestream < w*35){
av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n"); av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
return -1; return -1;
} }

View File

@@ -1799,6 +1799,12 @@ static int decode_slice_header(H264Context *h, H264Context *h0){
else else
s->height= 16*s->mb_height - 4*FFMIN(h->sps.crop_bottom, 3); s->height= 16*s->mb_height - 4*FFMIN(h->sps.crop_bottom, 3);
if (FFALIGN(s->avctx->width, 16) == s->width &&
FFALIGN(s->avctx->height, 16) == s->height) {
s->width = s->avctx->width;
s->height = s->avctx->height;
}
if (s->context_initialized if (s->context_initialized
&& ( s->width != s->avctx->width || s->height != s->avctx->height && ( s->width != s->avctx->width || s->height != s->avctx->height
|| av_cmp_q(h->sps.sar, s->avctx->sample_aspect_ratio))) { || av_cmp_q(h->sps.sar, s->avctx->sample_aspect_ratio))) {

View File

@@ -279,12 +279,13 @@ static void generate_joint_tables(HYuvContext *s){
for(i=y=0; y<256; y++){ for(i=y=0; y<256; y++){
int len0 = s->len[0][y]; int len0 = s->len[0][y];
int limit = VLC_BITS - len0; int limit = VLC_BITS - len0;
if(limit <= 0) if(limit <= 0 || !len0)
continue; continue;
for(u=0; u<256; u++){ for(u=0; u<256; u++){
int len1 = s->len[p][u]; int len1 = s->len[p][u];
if(len1 > limit) if (len1 > limit || !len1)
continue; continue;
assert(i < (1 << VLC_BITS));
len[i] = len0 + len1; len[i] = len0 + len1;
bits[i] = (s->bits[0][y] << len1) + s->bits[p][u]; bits[i] = (s->bits[0][y] << len1) + s->bits[p][u];
symbols[i] = (y<<8) + u; symbols[i] = (y<<8) + u;
@@ -306,18 +307,19 @@ static void generate_joint_tables(HYuvContext *s){
for(i=0, g=-16; g<16; g++){ for(i=0, g=-16; g<16; g++){
int len0 = s->len[p0][g&255]; int len0 = s->len[p0][g&255];
int limit0 = VLC_BITS - len0; int limit0 = VLC_BITS - len0;
if(limit0 < 2) if (limit0 < 2 || !len0)
continue; continue;
for(b=-16; b<16; b++){ for(b=-16; b<16; b++){
int len1 = s->len[p1][b&255]; int len1 = s->len[p1][b&255];
int limit1 = limit0 - len1; int limit1 = limit0 - len1;
if(limit1 < 1) if (limit1 < 1 || !len1)
continue; continue;
code = (s->bits[p0][g&255] << len1) + s->bits[p1][b&255]; code = (s->bits[p0][g&255] << len1) + s->bits[p1][b&255];
for(r=-16; r<16; r++){ for(r=-16; r<16; r++){
int len2 = s->len[2][r&255]; int len2 = s->len[2][r&255];
if(len2 > limit1) if (len2 > limit1 || !len2)
continue; continue;
assert(i < (1 << VLC_BITS));
len[i] = len0 + len1 + len2; len[i] = len0 + len1 + len2;
bits[i] = (code << len2) + s->bits[2][r&255]; bits[i] = (code << len2) + s->bits[2][r&255];
if(s->decorrelate){ if(s->decorrelate){
@@ -341,6 +343,7 @@ static void generate_joint_tables(HYuvContext *s){
static int read_huffman_tables(HYuvContext *s, const uint8_t *src, int length){ static int read_huffman_tables(HYuvContext *s, const uint8_t *src, int length){
GetBitContext gb; GetBitContext gb;
int i; int i;
int ret;
init_get_bits(&gb, src, length*8); init_get_bits(&gb, src, length*8);
@@ -356,7 +359,8 @@ printf("%6X, %2d, %3d\n", s->bits[i][j], s->len[i][j], j);
} }
#endif #endif
free_vlc(&s->vlc[i]); free_vlc(&s->vlc[i]);
init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4, 0); if ((ret = init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4, 0)) < 0)
return ret;
} }
generate_joint_tables(s); generate_joint_tables(s);
@@ -368,6 +372,7 @@ static int read_old_huffman_tables(HYuvContext *s){
#if 1 #if 1
GetBitContext gb; GetBitContext gb;
int i; int i;
int ret;
init_get_bits(&gb, classic_shift_luma, sizeof(classic_shift_luma)*8); init_get_bits(&gb, classic_shift_luma, sizeof(classic_shift_luma)*8);
if(read_len_table(s->len[0], &gb)<0) if(read_len_table(s->len[0], &gb)<0)
@@ -388,7 +393,8 @@ static int read_old_huffman_tables(HYuvContext *s){
for(i=0; i<3; i++){ for(i=0; i<3; i++){
free_vlc(&s->vlc[i]); free_vlc(&s->vlc[i]);
init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4, 0); if ((ret = init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4, 0)) < 0)
return ret;
} }
generate_joint_tables(s); generate_joint_tables(s);

View File

@@ -851,7 +851,8 @@ static enum PixelFormat avcodec_find_best_pix_fmt1(int64_t pix_fmt_mask,
/* find exact color match with smallest size */ /* find exact color match with smallest size */
dst_pix_fmt = PIX_FMT_NONE; dst_pix_fmt = PIX_FMT_NONE;
min_dist = 0x7fffffff; min_dist = 0x7fffffff;
for(i = 0;i < PIX_FMT_NB; i++) { /* test only the first 64 pixel formats to avoid undefined behaviour */
for (i = 0; i < 64; i++) {
if (pix_fmt_mask & (1ULL << i)) { if (pix_fmt_mask & (1ULL << i)) {
loss = avcodec_get_pix_fmt_loss(i, src_pix_fmt, has_alpha) & loss_mask; loss = avcodec_get_pix_fmt_loss(i, src_pix_fmt, has_alpha) & loss_mask;
if (loss == 0) { if (loss == 0) {

View File

@@ -727,7 +727,8 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s,
0, 0, 0, 0, 0, 0,
ref_picture, pix_op, qpix_op, ref_picture, pix_op, qpix_op,
s->mv[dir][0][0], s->mv[dir][0][1], 16); 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, ff_mspel_motion(s, dest_y, dest_cb, dest_cr,
ref_picture, pix_op, ref_picture, pix_op,
s->mv[dir][0][0], s->mv[dir][0][1], 16); s->mv[dir][0][0], s->mv[dir][0][1], 16);

View File

@@ -184,17 +184,18 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,
} }
if (c->codec_frameheader) { if (c->codec_frameheader) {
int w, h, q; int w, h, q;
if (buf_size < 12) { if (buf_size < RTJPEG_HEADER_SIZE || buf[4] != RTJPEG_HEADER_SIZE ||
buf[5] != RTJPEG_FILE_VERSION) {
av_log(avctx, AV_LOG_ERROR, "invalid nuv video frame\n"); av_log(avctx, AV_LOG_ERROR, "invalid nuv video frame\n");
return -1; return AVERROR_INVALIDDATA;
} }
w = AV_RL16(&buf[6]); w = AV_RL16(&buf[6]);
h = AV_RL16(&buf[8]); h = AV_RL16(&buf[8]);
q = buf[10]; q = buf[10];
if (!codec_reinit(avctx, w, h, q)) if (!codec_reinit(avctx, w, h, q))
return -1; return -1;
buf = &buf[12]; buf = &buf[RTJPEG_HEADER_SIZE];
buf_size -= 12; buf_size -= RTJPEG_HEADER_SIZE;
} }
if (keyframe && c->pic.data[0]) if (keyframe && c->pic.data[0])

View File

@@ -83,7 +83,7 @@ static void rpza_decode_stream(RpzaContext *s)
unsigned short *pixels = (unsigned short *)s->frame.data[0]; unsigned short *pixels = (unsigned short *)s->frame.data[0];
int row_ptr = 0; int row_ptr = 0;
int pixel_ptr = 0; int pixel_ptr = -4;
int block_ptr; int block_ptr;
int pixel_x, pixel_y; int pixel_x, pixel_y;
int total_blocks; int total_blocks;
@@ -139,6 +139,7 @@ static void rpza_decode_stream(RpzaContext *s)
colorA = AV_RB16 (&s->buf[stream_ptr]); colorA = AV_RB16 (&s->buf[stream_ptr]);
stream_ptr += 2; stream_ptr += 2;
while (n_blocks--) { while (n_blocks--) {
ADVANCE_BLOCK()
block_ptr = row_ptr + pixel_ptr; block_ptr = row_ptr + pixel_ptr;
for (pixel_y = 0; pixel_y < 4; pixel_y++) { for (pixel_y = 0; pixel_y < 4; pixel_y++) {
for (pixel_x = 0; pixel_x < 4; pixel_x++){ for (pixel_x = 0; pixel_x < 4; pixel_x++){
@@ -147,7 +148,6 @@ static void rpza_decode_stream(RpzaContext *s)
} }
block_ptr += row_inc; block_ptr += row_inc;
} }
ADVANCE_BLOCK();
} }
break; break;
@@ -184,6 +184,7 @@ static void rpza_decode_stream(RpzaContext *s)
color4[2] |= ((21 * ta + 11 * tb) >> 5); color4[2] |= ((21 * ta + 11 * tb) >> 5);
while (n_blocks--) { while (n_blocks--) {
ADVANCE_BLOCK();
block_ptr = row_ptr + pixel_ptr; block_ptr = row_ptr + pixel_ptr;
for (pixel_y = 0; pixel_y < 4; pixel_y++) { for (pixel_y = 0; pixel_y < 4; pixel_y++) {
index = s->buf[stream_ptr++]; index = s->buf[stream_ptr++];
@@ -194,12 +195,12 @@ static void rpza_decode_stream(RpzaContext *s)
} }
block_ptr += row_inc; block_ptr += row_inc;
} }
ADVANCE_BLOCK();
} }
break; break;
/* Fill block with 16 colors */ /* Fill block with 16 colors */
case 0x00: case 0x00:
ADVANCE_BLOCK();
block_ptr = row_ptr + pixel_ptr; block_ptr = row_ptr + pixel_ptr;
for (pixel_y = 0; pixel_y < 4; pixel_y++) { for (pixel_y = 0; pixel_y < 4; pixel_y++) {
for (pixel_x = 0; pixel_x < 4; pixel_x++){ for (pixel_x = 0; pixel_x < 4; pixel_x++){
@@ -213,7 +214,6 @@ static void rpza_decode_stream(RpzaContext *s)
} }
block_ptr += row_inc; block_ptr += row_inc;
} }
ADVANCE_BLOCK();
break; break;
/* Unknown opcode */ /* Unknown opcode */

View File

@@ -25,6 +25,9 @@
#include <stdint.h> #include <stdint.h>
#include "dsputil.h" #include "dsputil.h"
#define RTJPEG_FILE_VERSION 0
#define RTJPEG_HEADER_SIZE 12
typedef struct { typedef struct {
int w, h; int w, h;
DSPContext *dsp; DSPContext *dsp;

View File

@@ -3328,6 +3328,7 @@ AVCodec vc1_decoder = {
vc1_decode_frame, vc1_decode_frame,
CODEC_CAP_DR1 | CODEC_CAP_DELAY, CODEC_CAP_DR1 | CODEC_CAP_DELAY,
NULL, NULL,
.flush = ff_mpeg_flush,
.long_name = NULL_IF_CONFIG_SMALL("SMPTE VC-1"), .long_name = NULL_IF_CONFIG_SMALL("SMPTE VC-1"),
.pix_fmts = ff_hwaccel_pixfmt_list_420 .pix_fmts = ff_hwaccel_pixfmt_list_420
}; };
@@ -3344,6 +3345,7 @@ AVCodec wmv3_decoder = {
vc1_decode_frame, vc1_decode_frame,
CODEC_CAP_DR1 | CODEC_CAP_DELAY, CODEC_CAP_DR1 | CODEC_CAP_DELAY,
NULL, NULL,
.flush = ff_mpeg_flush,
.long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9"), .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9"),
.pix_fmts = ff_hwaccel_pixfmt_list_420 .pix_fmts = ff_hwaccel_pixfmt_list_420
}; };

View File

@@ -123,7 +123,8 @@ int ff_vorbis_len2vlc(uint8_t *bits, uint32_t *codes, uint_fast32_t num)
return 0; return 0;
} }
void ff_vorbis_ready_floor1_list(vorbis_floor1_entry * list, int values) int ff_vorbis_ready_floor1_list(AVCodecContext *avccontext,
vorbis_floor1_entry *list, int values)
{ {
int i; int i;
list[0].sort = 0; list[0].sort = 0;
@@ -147,6 +148,11 @@ void ff_vorbis_ready_floor1_list(vorbis_floor1_entry * list, int values)
for (i = 0; i < values - 1; i++) { for (i = 0; i < values - 1; i++) {
int j; int j;
for (j = i + 1; j < values; j++) { for (j = i + 1; j < values; j++) {
if (list[i].x == list[j].x) {
av_log(avccontext, AV_LOG_ERROR,
"Duplicate value found in floor 1 X coordinates\n");
return AVERROR_INVALIDDATA;
}
if (list[list[i].sort].x > list[list[j].sort].x) { if (list[list[i].sort].x > list[list[j].sort].x) {
int tmp = list[i].sort; int tmp = list[i].sort;
list[i].sort = list[j].sort; list[i].sort = list[j].sort;
@@ -154,6 +160,7 @@ void ff_vorbis_ready_floor1_list(vorbis_floor1_entry * list, int values)
} }
} }
} }
return 0;
} }
static inline void render_line_unrolled(intptr_t x, uint8_t y, int x1, static inline void render_line_unrolled(intptr_t x, uint8_t y, int x1,

View File

@@ -35,7 +35,8 @@ typedef struct {
uint_fast16_t high; uint_fast16_t high;
} vorbis_floor1_entry; } vorbis_floor1_entry;
void ff_vorbis_ready_floor1_list(vorbis_floor1_entry * list, int values); int ff_vorbis_ready_floor1_list(AVCodecContext *avccontext,
vorbis_floor1_entry *list, int values);
unsigned int ff_vorbis_nth_root(unsigned int x, unsigned int n); // x^(1/n) unsigned int ff_vorbis_nth_root(unsigned int x, unsigned int n); // x^(1/n)
int ff_vorbis_len2vlc(uint8_t *bits, uint32_t *codes, uint_fast32_t num); int ff_vorbis_len2vlc(uint8_t *bits, uint32_t *codes, uint_fast32_t num);
void ff_vorbis_floor1_render_list(vorbis_floor1_entry * list, int values, void ff_vorbis_floor1_render_list(vorbis_floor1_entry * list, int values,

View File

@@ -550,7 +550,11 @@ static int vorbis_parse_setup_hdr_floors(vorbis_context *vc)
} }
// Precalculate order of x coordinates - needed for decode // Precalculate order of x coordinates - needed for decode
ff_vorbis_ready_floor1_list(floor_setup->data.t1.list, floor_setup->data.t1.x_list_dim); if (ff_vorbis_ready_floor1_list(vc->avccontext,
floor_setup->data.t1.list,
floor_setup->data.t1.x_list_dim)) {
return AVERROR_INVALIDDATA;
}
} else if (floor_setup->floor_type == 0) { } else if (floor_setup->floor_type == 0) {
uint_fast8_t max_codebook_dim = 0; uint_fast8_t max_codebook_dim = 0;

View File

@@ -302,7 +302,8 @@ static void create_vorbis_context(vorbis_enc_context *venc,
}; };
fc->list[i].x = a[i - 2]; fc->list[i].x = a[i - 2];
} }
ff_vorbis_ready_floor1_list(fc->list, fc->values); if (ff_vorbis_ready_floor1_list(avccontext, fc->list, fc->values))
return AVERROR(EINVAL);
venc->nresidues = 1; venc->nresidues = 1;
venc->residues = av_malloc(sizeof(vorbis_enc_residue) * venc->nresidues); venc->residues = av_malloc(sizeof(vorbis_enc_residue) * venc->nresidues);

View File

@@ -44,6 +44,9 @@ AVFilterFormats *avfilter_merge_formats(AVFilterFormats *a, AVFilterFormats *b)
AVFilterFormats *ret; AVFilterFormats *ret;
unsigned i, j, k = 0; unsigned i, j, k = 0;
if (a == b)
return a;
ret = av_mallocz(sizeof(AVFilterFormats)); ret = av_mallocz(sizeof(AVFilterFormats));
/* merge list of formats */ /* merge list of formats */

View File

@@ -1868,10 +1868,11 @@ static int matroska_read_seek(AVFormatContext *s, int stream_index,
if (tracks[i].type == MATROSKA_TRACK_TYPE_SUBTITLE if (tracks[i].type == MATROSKA_TRACK_TYPE_SUBTITLE
&& !tracks[i].stream->discard != AVDISCARD_ALL) { && !tracks[i].stream->discard != AVDISCARD_ALL) {
index_sub = av_index_search_timestamp(tracks[i].stream, st->index_entries[index].timestamp, AVSEEK_FLAG_BACKWARD); index_sub = av_index_search_timestamp(tracks[i].stream, st->index_entries[index].timestamp, AVSEEK_FLAG_BACKWARD);
if (index_sub >= 0 while(index_sub >= 0
&& st->index_entries[index_sub].pos < st->index_entries[index_min].pos && index_min >= 0
&& st->index_entries[index].timestamp - st->index_entries[index_sub].timestamp < 30000000000/matroska->time_scale) && tracks[i].stream->index_entries[index_sub].pos < st->index_entries[index_min].pos
index_min = index_sub; && st->index_entries[index].timestamp - tracks[i].stream->index_entries[index_sub].timestamp < 30000000000/matroska->time_scale)
index_min--;
} }
} }

View File

@@ -1820,9 +1820,6 @@ static int mov_read_trak(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
#if CONFIG_H263_DECODER #if CONFIG_H263_DECODER
case CODEC_ID_H263: case CODEC_ID_H263:
#endif #endif
#if CONFIG_H264_DECODER
case CODEC_ID_H264:
#endif
#if CONFIG_MPEG4_DECODER #if CONFIG_MPEG4_DECODER
case CODEC_ID_MPEG4: case CODEC_ID_MPEG4:
#endif #endif

View File

@@ -275,11 +275,11 @@ int ff_amf_tag_size(const uint8_t *data, const uint8_t *data_end)
data++; data++;
break; break;
} }
if (data + size >= data_end || data + size < data) if (size < 0 || size >= data_end - data)
return -1; return -1;
data += size; data += size;
t = ff_amf_tag_size(data, data_end); t = ff_amf_tag_size(data, data_end);
if (t < 0 || data + t >= data_end) if (t < 0 || t >= data_end - data)
return -1; return -1;
data += t; data += t;
} }
@@ -308,7 +308,7 @@ int ff_amf_get_field_value(const uint8_t *data, const uint8_t *data_end,
int size = bytestream_get_be16(&data); int size = bytestream_get_be16(&data);
if (!size) if (!size)
break; break;
if (data + size >= data_end || data + size < data) if (size < 0 || size >= data_end - data)
return -1; return -1;
data += size; data += size;
if (size == namelen && !memcmp(data-size, name, namelen)) { if (size == namelen && !memcmp(data-size, name, namelen)) {
@@ -329,7 +329,7 @@ int ff_amf_get_field_value(const uint8_t *data, const uint8_t *data_end,
return 0; return 0;
} }
len = ff_amf_tag_size(data, data_end); len = ff_amf_tag_size(data, data_end);
if (len < 0 || data + len >= data_end || data + len < data) if (len < 0 || len >= data_end - data)
return -1; return -1;
data += len; data += len;
} }
@@ -359,7 +359,7 @@ static const char* rtmp_packet_type(int type)
static void ff_amf_tag_contents(void *ctx, const uint8_t *data, const uint8_t *data_end) static void ff_amf_tag_contents(void *ctx, const uint8_t *data, const uint8_t *data_end)
{ {
int size; unsigned int size;
char buf[1024]; char buf[1024];
if (data >= data_end) if (data >= data_end)
@@ -378,7 +378,7 @@ static void ff_amf_tag_contents(void *ctx, const uint8_t *data, const uint8_t *d
} else { } else {
size = bytestream_get_be32(&data); size = bytestream_get_be32(&data);
} }
size = FFMIN(size, 1023); size = FFMIN(size, sizeof(buf) - 1);
memcpy(buf, data, size); memcpy(buf, data, size);
buf[size] = 0; buf[size] = 0;
av_log(ctx, AV_LOG_DEBUG, " string '%s'\n", buf); av_log(ctx, AV_LOG_DEBUG, " string '%s'\n", buf);
@@ -391,22 +391,21 @@ static void ff_amf_tag_contents(void *ctx, const uint8_t *data, const uint8_t *d
case AMF_DATA_TYPE_OBJECT: case AMF_DATA_TYPE_OBJECT:
av_log(ctx, AV_LOG_DEBUG, " {\n"); av_log(ctx, AV_LOG_DEBUG, " {\n");
for (;;) { for (;;) {
int size = bytestream_get_be16(&data);
int t; int t;
memcpy(buf, data, size); size = bytestream_get_be16(&data);
buf[size] = 0; av_strlcpy(buf, data, FFMIN(sizeof(buf), size + 1));
if (!size) { if (!size) {
av_log(ctx, AV_LOG_DEBUG, " }\n"); av_log(ctx, AV_LOG_DEBUG, " }\n");
data++; data++;
break; break;
} }
if (data + size >= data_end || data + size < data) if (size >= data_end - data)
return; return;
data += size; data += size;
av_log(ctx, AV_LOG_DEBUG, " %s: ", buf); av_log(ctx, AV_LOG_DEBUG, " %s: ", buf);
ff_amf_tag_contents(ctx, data, data_end); ff_amf_tag_contents(ctx, data, data_end);
t = ff_amf_tag_size(data, data_end); t = ff_amf_tag_size(data, data_end);
if (t < 0 || data + t >= data_end) if (t < 0 || t >= data_end - data)
return; return;
data += t; data += t;
} }

View File

@@ -498,8 +498,10 @@ static int swf_write_trailer(AVFormatContext *s)
put_le32(pb, file_size); put_le32(pb, file_size);
url_fseek(pb, swf->duration_pos, SEEK_SET); url_fseek(pb, swf->duration_pos, SEEK_SET);
put_le16(pb, swf->video_frame_number); put_le16(pb, swf->video_frame_number);
if (swf->vframes_pos) {
url_fseek(pb, swf->vframes_pos, SEEK_SET); url_fseek(pb, swf->vframes_pos, SEEK_SET);
put_le16(pb, swf->video_frame_number); put_le16(pb, swf->video_frame_number);
}
url_fseek(pb, file_size, SEEK_SET); url_fseek(pb, file_size, SEEK_SET);
} }
return 0; return 0;