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,
 | 
			
		||||
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,17 +208,29 @@ 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, \
 | 
			
		||||
%if ARCH_X86_32
 | 
			
		||||
cglobal yadif_filter_line, 4, 6, 8, 80, dst, prev, cur, next, w, prefs, \
 | 
			
		||||
                                        mrefs, parity, mode
 | 
			
		||||
    test             wq, wq
 | 
			
		||||
%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
 | 
			
		||||
    je .parity0
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user