mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-24 13:56:33 +02:00
Merge commit 'a1c525f7eb0783d31ba7a653865b6cbd3dc880de'
* commit 'a1c525f7eb0783d31ba7a653865b6cbd3dc880de': pcx: return meaningful error codes. tmv: return meaningful error codes. msrle: return meaningful error codes. cscd: return meaningful error codes. yadif: x86: fix build for compilers without aligned stack lavc: introduce the convenience function init_get_bits8 lavc: check for overflow in init_get_bits Conflicts: libavcodec/cscd.c libavcodec/pcx.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
329675cfd7
@ -68,18 +68,19 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
|
||||
int buf_size = avpkt->size;
|
||||
CamStudioContext *c = avctx->priv_data;
|
||||
AVFrame *picture = data;
|
||||
int ret;
|
||||
|
||||
if (buf_size < 2) {
|
||||
av_log(avctx, AV_LOG_ERROR, "coded frame too small\n");
|
||||
return -1;
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
c->pic.reference = 3;
|
||||
c->pic.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_READABLE |
|
||||
FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE;
|
||||
if (avctx->reget_buffer(avctx, &c->pic) < 0) {
|
||||
if ((ret = avctx->reget_buffer(avctx, &c->pic)) < 0) {
|
||||
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
|
||||
return -1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
// decompress data
|
||||
@ -98,12 +99,12 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
|
||||
break;
|
||||
#else
|
||||
av_log(avctx, AV_LOG_ERROR, "compiled without zlib support\n");
|
||||
return -1;
|
||||
return AVERROR(ENOSYS);
|
||||
#endif
|
||||
}
|
||||
default:
|
||||
av_log(avctx, AV_LOG_ERROR, "unknown compression\n");
|
||||
return -1;
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
// flip upside down, add difference frame
|
||||
|
@ -366,25 +366,49 @@ static inline int check_marker(GetBitContext *s, const char *msg)
|
||||
}
|
||||
|
||||
/**
|
||||
* Inititalize GetBitContext.
|
||||
* @param buffer bitstream buffer, must be FF_INPUT_BUFFER_PADDING_SIZE bytes larger than the actual read bits
|
||||
* because some optimized bitstream readers read 32 or 64 bit at once and could read over the end
|
||||
* Initialize GetBitContext.
|
||||
* @param buffer bitstream buffer, must be FF_INPUT_BUFFER_PADDING_SIZE bytes
|
||||
* larger than the actual read bits because some optimized bitstream
|
||||
* readers read 32 or 64 bit at once and could read over the end
|
||||
* @param bit_size the size of the buffer in bits
|
||||
* @return 0 on success, AVERROR_INVALIDDATA if the buffer_size would overflow.
|
||||
*/
|
||||
static inline void init_get_bits(GetBitContext *s, const uint8_t *buffer,
|
||||
int bit_size)
|
||||
static inline int init_get_bits(GetBitContext *s, const uint8_t *buffer,
|
||||
int bit_size)
|
||||
{
|
||||
int buffer_size = (bit_size+7)>>3;
|
||||
if (buffer_size < 0 || bit_size < 0) {
|
||||
int buffer_size;
|
||||
int ret = 0;
|
||||
|
||||
if (bit_size > INT_MAX - 7 || bit_size < 0) {
|
||||
buffer_size = bit_size = 0;
|
||||
buffer = NULL;
|
||||
ret = AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
buffer_size = (bit_size + 7) >> 3;
|
||||
|
||||
s->buffer = buffer;
|
||||
s->size_in_bits = bit_size;
|
||||
s->size_in_bits_plus8 = bit_size + 8;
|
||||
s->buffer_end = buffer + buffer_size;
|
||||
s->index = 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize GetBitContext.
|
||||
* @param buffer bitstream buffer, must be FF_INPUT_BUFFER_PADDING_SIZE bytes
|
||||
* larger than the actual read bits because some optimized bitstream
|
||||
* readers read 32 or 64 bit at once and could read over the end
|
||||
* @param byte_size the size of the buffer in bytes
|
||||
* @return 0 on success, AVERROR_INVALIDDATA if the buffer_size would overflow.
|
||||
*/
|
||||
static inline int init_get_bits8(GetBitContext *s, const uint8_t *buffer,
|
||||
int byte_size)
|
||||
{
|
||||
if (byte_size > INT_MAX / 8)
|
||||
return AVERROR_INVALIDDATA;
|
||||
return init_get_bits(s, buffer, byte_size * 8);
|
||||
}
|
||||
|
||||
static inline void align_get_bits(GetBitContext *s)
|
||||
|
@ -67,7 +67,7 @@ static av_cold int msrle_decode_init(AVCodecContext *avctx)
|
||||
break;
|
||||
default:
|
||||
av_log(avctx, AV_LOG_ERROR, "unsupported bits per sample\n");
|
||||
return -1;
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
avcodec_get_frame_defaults(&s->frame);
|
||||
@ -88,15 +88,16 @@ static int msrle_decode_frame(AVCodecContext *avctx,
|
||||
int buf_size = avpkt->size;
|
||||
MsrleContext *s = avctx->priv_data;
|
||||
int istride = FFALIGN(avctx->width*avctx->bits_per_coded_sample, 32) / 8;
|
||||
int ret;
|
||||
|
||||
s->buf = buf;
|
||||
s->size = buf_size;
|
||||
|
||||
s->frame.reference = 3;
|
||||
s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE;
|
||||
if (avctx->reget_buffer(avctx, &s->frame)) {
|
||||
if ((ret = avctx->reget_buffer(avctx, &s->frame)) < 0) {
|
||||
av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
|
||||
return -1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (avctx->bits_per_coded_sample > 1 && avctx->bits_per_coded_sample <= 8) {
|
||||
|
@ -147,8 +147,8 @@ static int pcx_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
|
||||
if (p->data[0])
|
||||
avctx->release_buffer(avctx, p);
|
||||
|
||||
if (av_image_check_size(w, h, 0, avctx))
|
||||
return AVERROR_INVALIDDATA;
|
||||
if ((ret = av_image_check_size(w, h, 0, avctx)) < 0)
|
||||
return ret;
|
||||
if (w != avctx->width || h != avctx->height)
|
||||
avcodec_set_dimensions(avctx, w, h);
|
||||
if ((ret = ff_get_buffer(avctx, p)) < 0) {
|
||||
|
@ -48,20 +48,21 @@ static int tmv_decode_frame(AVCodecContext *avctx, void *data,
|
||||
unsigned char_cols = avctx->width >> 3;
|
||||
unsigned char_rows = avctx->height >> 3;
|
||||
unsigned x, y, fg, bg, c;
|
||||
int ret;
|
||||
|
||||
if (tmv->pic.data[0])
|
||||
avctx->release_buffer(avctx, &tmv->pic);
|
||||
|
||||
if (ff_get_buffer(avctx, &tmv->pic) < 0) {
|
||||
if ((ret = ff_get_buffer(avctx, &tmv->pic)) < 0) {
|
||||
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
|
||||
return -1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (avpkt->size < 2*char_rows*char_cols) {
|
||||
av_log(avctx, AV_LOG_ERROR,
|
||||
"Input buffer too small, truncated sample?\n");
|
||||
*got_frame = 0;
|
||||
return -1;
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
tmv->pic.pict_type = AV_PICTURE_TYPE_I;
|
||||
|
@ -31,8 +31,8 @@ pw_1: times 8 dw 1
|
||||
SECTION .text
|
||||
|
||||
%macro CHECK 2
|
||||
movu m2, [curq+mrefsq+%1]
|
||||
movu m3, [curq+prefsq+%2]
|
||||
movu m2, [curq+t1+%1]
|
||||
movu m3, [curq+t0+%2]
|
||||
mova m4, m2
|
||||
mova m5, m2
|
||||
pxor m4, m3
|
||||
@ -97,8 +97,8 @@ SECTION .text
|
||||
%macro FILTER 3
|
||||
.loop%1:
|
||||
pxor m7, m7
|
||||
LOAD 0, [curq+mrefsq]
|
||||
LOAD 1, [curq+prefsq]
|
||||
LOAD 0, [curq+t1]
|
||||
LOAD 1, [curq+t0]
|
||||
LOAD 2, [%2]
|
||||
LOAD 3, [%3]
|
||||
mova m4, m3
|
||||
@ -109,8 +109,8 @@ SECTION .text
|
||||
mova [rsp+32], m1
|
||||
psubw m2, m4
|
||||
ABS1 m2, m4
|
||||
LOAD 3, [prevq+mrefsq]
|
||||
LOAD 4, [prevq+prefsq]
|
||||
LOAD 3, [prevq+t1]
|
||||
LOAD 4, [prevq+t0]
|
||||
psubw m3, m0
|
||||
psubw m4, m1
|
||||
ABS1 m3, m5
|
||||
@ -119,8 +119,8 @@ SECTION .text
|
||||
psrlw m2, 1
|
||||
psrlw m3, 1
|
||||
pmaxsw m2, m3
|
||||
LOAD 3, [nextq+mrefsq]
|
||||
LOAD 4, [nextq+prefsq]
|
||||
LOAD 3, [nextq+t1]
|
||||
LOAD 4, [nextq+t0]
|
||||
psubw m3, m0
|
||||
psubw m4, m1
|
||||
ABS1 m3, m5
|
||||
@ -136,8 +136,8 @@ SECTION .text
|
||||
psrlw m1, 1
|
||||
ABS1 m0, m2
|
||||
|
||||
movu m2, [curq+mrefsq-1]
|
||||
movu m3, [curq+prefsq-1]
|
||||
movu m2, [curq+t1-1]
|
||||
movu m3, [curq+t0-1]
|
||||
mova m4, m2
|
||||
psubusb m2, m3
|
||||
psubusb m3, m4
|
||||
@ -164,12 +164,12 @@ SECTION .text
|
||||
CHECK2
|
||||
|
||||
mova m6, [rsp+48]
|
||||
cmp DWORD modem, 2
|
||||
cmp DWORD r8m, 2
|
||||
jge .end%1
|
||||
LOAD 2, [%2+mrefsq*2]
|
||||
LOAD 4, [%3+mrefsq*2]
|
||||
LOAD 3, [%2+prefsq*2]
|
||||
LOAD 5, [%3+prefsq*2]
|
||||
LOAD 2, [%2+t1*2]
|
||||
LOAD 4, [%3+t1*2]
|
||||
LOAD 3, [%2+t0*2]
|
||||
LOAD 5, [%3+t0*2]
|
||||
paddw m2, m4
|
||||
paddw m3, m5
|
||||
psrlw m2, 1
|
||||
@ -208,19 +208,31 @@ SECTION .text
|
||||
add prevq, mmsize/2
|
||||
add curq, mmsize/2
|
||||
add nextq, mmsize/2
|
||||
sub wd, mmsize/2
|
||||
sub DWORD r4m, mmsize/2
|
||||
jg .loop%1
|
||||
%endmacro
|
||||
|
||||
%macro YADIF 0
|
||||
cglobal yadif_filter_line, 7, 7, 8, 16*5, dst, prev, cur, next, w, prefs, \
|
||||
mrefs, parity, mode
|
||||
test wq, wq
|
||||
%if ARCH_X86_32
|
||||
cglobal yadif_filter_line, 4, 6, 8, 80, dst, prev, cur, next, w, prefs, \
|
||||
mrefs, parity, mode
|
||||
%else
|
||||
cglobal yadif_filter_line, 4, 7, 8, 80, dst, prev, cur, next, w, prefs, \
|
||||
mrefs, parity, mode
|
||||
%endif
|
||||
cmp DWORD wm, 0
|
||||
jle .ret
|
||||
movsxdifnidn prefsq, prefsd
|
||||
movsxdifnidn mrefsq, mrefsd
|
||||
%if ARCH_X86_32
|
||||
mov r4, r5mp
|
||||
mov r5, r6mp
|
||||
DECLARE_REG_TMP 4,5
|
||||
%else
|
||||
movsxd r5, DWORD r5m
|
||||
movsxd r6, DWORD r6m
|
||||
DECLARE_REG_TMP 5,6
|
||||
%endif
|
||||
|
||||
cmp DWORD paritym, 0
|
||||
cmp DWORD paritym, 0
|
||||
je .parity0
|
||||
FILTER 1, prevq, curq
|
||||
jmp .ret
|
||||
|
Loading…
x
Reference in New Issue
Block a user