mirror of
				https://github.com/nyanmisaka/ffmpeg-rockchip.git
				synced 2025-10-31 04:26:37 +08: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:
		| @@ -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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Michael Niedermayer
					Michael Niedermayer