From 7d333b87282c0ba032002d207dc334f901903515 Mon Sep 17 00:00:00 2001 From: v0lt Date: Sat, 13 Jul 2024 08:49:04 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20ffmpeg=20n7.1-dev-1805-g9af348bd1a.=20=D0=A3=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=B0=D0=BD=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=88=D0=B8?= =?UTF-8?q?=D0=B1=D0=BA=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=B8=D0=BB=D1=8F?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20https://g?= =?UTF-8?q?ithub.com/FFmpeg/FFmpeg/commit/e9e8bea2e79bc3c481a6f81f75f6c871?= =?UTF-8?q?e3e0f367.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/Changelog.Rus.txt | 2 +- docs/Changelog.txt | 2 +- src/ExtLib/ffmpeg/libavcodec/flac_parser.c | 2 + src/ExtLib/ffmpeg/libavcodec/golomb.h | 5 + src/ExtLib/ffmpeg/libavcodec/hevc/hevcdec.c | 21 +-- src/ExtLib/ffmpeg/libavcodec/me_cmp.c | 2 +- src/ExtLib/ffmpeg/libavcodec/motion_est.c | 2 +- src/ExtLib/ffmpeg/libavcodec/packet.c | 1 + src/ExtLib/ffmpeg/libavcodec/packet.h | 13 ++ src/ExtLib/ffmpeg/libavcodec/version.h | 2 +- src/ExtLib/ffmpeg/libavcodec/vvc/refs.c | 2 +- src/ExtLib/ffmpeg/libavcodec/vvc/thread.c | 2 +- src/ExtLib/ffmpeg/libavfilter/af_aresample.c | 5 +- src/ExtLib/ffmpeg/libavutil/executor.c | 16 +- .../ffmpeg/libavutil/hwcontext_d3d11va.c | 3 +- src/ExtLib/ffmpeg/libavutil/hwcontext_dxva2.c | 2 +- src/ExtLib/ffmpeg/libavutil/imgutils.c | 2 +- src/ExtLib/ffmpeg/libavutil/wchar_filename.h | 2 +- .../ffmpeg/libavutil/x86/intreadwrite.h | 32 +--- src/ExtLib/ffmpeg/libswscale/swscale.c | 4 +- .../ffmpeg/libswscale/swscale_internal.h | 2 - src/ExtLib/ffmpeg/libswscale/utils.c | 4 - src/ExtLib/ffmpeg/libswscale/x86/swscale.c | 2 - .../ffmpeg/libswscale/x86/swscale_template.c | 20 --- src/ExtLib/ffmpeg/libswscale/x86/yuv2rgb.c | 167 +++++++++++++++++- src/ExtLib/ffmpeg/libswscale/yuv2rgb.c | 4 +- 26 files changed, 235 insertions(+), 86 deletions(-) diff --git a/docs/Changelog.Rus.txt b/docs/Changelog.Rus.txt index eb5f5da2d0..553653952c 100644 --- a/docs/Changelog.Rus.txt +++ b/docs/Changelog.Rus.txt @@ -20,7 +20,7 @@ MPCVideoDec Обновлены библиотеки: dav1d 1.4.2-15-g2355eeb; - ffmpeg n7.1-dev-1688-ge0eff64ed1; + ffmpeg n7.1-dev-1805-g9af348bd1a; ResizableLib v1.5.3-8-g25a89da; vvdec v2.3.0-24-gad8f4bb. diff --git a/docs/Changelog.txt b/docs/Changelog.txt index 9173d5ebcf..c99bda0a74 100644 --- a/docs/Changelog.txt +++ b/docs/Changelog.txt @@ -20,7 +20,7 @@ Updated Japanese translation (by tsubasanouta). Updated libraries: dav1d 1.4.2-15-g2355eeb; - ffmpeg n7.1-dev-1688-ge0eff64ed1; + ffmpeg n7.1-dev-1805-g9af348bd1a; ResizableLib v1.5.3-8-g25a89da; vvdec v2.3.0-24-gad8f4bb. diff --git a/src/ExtLib/ffmpeg/libavcodec/flac_parser.c b/src/ExtLib/ffmpeg/libavcodec/flac_parser.c index 47904d515a..d9c47801f8 100644 --- a/src/ExtLib/ffmpeg/libavcodec/flac_parser.c +++ b/src/ExtLib/ffmpeg/libavcodec/flac_parser.c @@ -518,6 +518,8 @@ static int check_header_mismatch(FLACParseContext *fpc, for (i = 0; i < FLAC_MAX_SEQUENTIAL_HEADERS && curr != child; i++) curr = curr->next; + av_assert0(i < FLAC_MAX_SEQUENTIAL_HEADERS); + if (header->link_penalty[i] < FLAC_HEADER_CRC_FAIL_PENALTY || header->link_penalty[i] == FLAC_HEADER_NOT_PENALIZED_YET) { FLACHeaderMarker *start, *end; diff --git a/src/ExtLib/ffmpeg/libavcodec/golomb.h b/src/ExtLib/ffmpeg/libavcodec/golomb.h index 4f1285e908..e33a73955c 100644 --- a/src/ExtLib/ffmpeg/libavcodec/golomb.h +++ b/src/ExtLib/ffmpeg/libavcodec/golomb.h @@ -402,6 +402,7 @@ static inline int get_ur_golomb(GetBitContext *gb, int k, int limit, log = av_log2(buf); if (log > 31 - limit) { + av_assert2(log >= k); buf >>= log - k; buf += (30U - log) << k; LAST_SKIP_BITS(re, gb, 32 + k - log); @@ -424,6 +425,8 @@ static inline int get_ur_golomb(GetBitContext *gb, int k, int limit, /** * read unsigned golomb rice code (jpegls). + * + * @returns -1 on error */ static inline int get_ur_golomb_jpegls(GetBitContext *gb, int k, int limit, int esc_len) @@ -535,6 +538,8 @@ static inline int get_sr_golomb(GetBitContext *gb, int k, int limit, /** * read signed golomb rice code (flac). + * + * @returns INT_MIN on error */ static inline int get_sr_golomb_flac(GetBitContext *gb, int k, int limit, int esc_len) diff --git a/src/ExtLib/ffmpeg/libavcodec/hevc/hevcdec.c b/src/ExtLib/ffmpeg/libavcodec/hevc/hevcdec.c index 988f242331..47be8f8f74 100644 --- a/src/ExtLib/ffmpeg/libavcodec/hevc/hevcdec.c +++ b/src/ExtLib/ffmpeg/libavcodec/hevc/hevcdec.c @@ -2789,14 +2789,8 @@ static int decode_slice_data(HEVCContext *s, const H2645NAL *nal, GetBitContext const HEVCPPS *pps = s->pps; int ret; - if (s->sh.dependent_slice_segment_flag) { - int ctb_addr_ts = pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs]; - int prev_rs = pps->ctb_addr_ts_to_rs[ctb_addr_ts - 1]; - if (s->tab_slice_address[prev_rs] != s->sh.slice_addr) { - av_log(s->avctx, AV_LOG_ERROR, "Previous slice segment missing\n"); - return AVERROR_INVALIDDATA; - } - } + if (!s->sh.first_slice_in_pic_flag) + s->slice_idx += !s->sh.dependent_slice_segment_flag; if (!s->sh.dependent_slice_segment_flag && s->sh.slice_type != HEVC_SLICE_I) { ret = ff_hevc_slice_rpl(s); @@ -2818,6 +2812,15 @@ static int decode_slice_data(HEVCContext *s, const H2645NAL *nal, GetBitContext return AVERROR_PATCHWELCOME; } + if (s->sh.dependent_slice_segment_flag) { + int ctb_addr_ts = pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs]; + int prev_rs = pps->ctb_addr_ts_to_rs[ctb_addr_ts - 1]; + if (s->tab_slice_address[prev_rs] != s->sh.slice_addr) { + av_log(s->avctx, AV_LOG_ERROR, "Previous slice segment missing\n"); + return AVERROR_INVALIDDATA; + } + } + s->local_ctx[0].first_qp_group = !s->sh.dependent_slice_segment_flag; if (!pps->cu_qp_delta_enabled_flag) @@ -2826,8 +2829,6 @@ static int decode_slice_data(HEVCContext *s, const H2645NAL *nal, GetBitContext s->local_ctx[0].tu.cu_qp_offset_cb = 0; s->local_ctx[0].tu.cu_qp_offset_cr = 0; - s->slice_idx += !s->sh.dependent_slice_segment_flag; - if (s->avctx->active_thread_type == FF_THREAD_SLICE && s->sh.num_entry_point_offsets > 0 && pps->num_tile_rows == 1 && pps->num_tile_columns == 1) diff --git a/src/ExtLib/ffmpeg/libavcodec/me_cmp.c b/src/ExtLib/ffmpeg/libavcodec/me_cmp.c index 592ee76084..f3e2f2482e 100644 --- a/src/ExtLib/ffmpeg/libavcodec/me_cmp.c +++ b/src/ExtLib/ffmpeg/libavcodec/me_cmp.c @@ -517,7 +517,7 @@ av_cold int ff_set_cmp(const MECmpContext *c, me_cmp_func *cmp, int type, int mp cmp[i] = zero_cmp; return 0; } - if (type > FF_ARRAY_ELEMS(cmp_func_list) || + if (type >= FF_ARRAY_ELEMS(cmp_func_list) || !cmp_func_list[type].available || !mpvenc && cmp_func_list[type].mpv_only) { av_log(NULL, AV_LOG_ERROR, diff --git a/src/ExtLib/ffmpeg/libavcodec/motion_est.c b/src/ExtLib/ffmpeg/libavcodec/motion_est.c index 554fc9780e..e4f17fb2d8 100644 --- a/src/ExtLib/ffmpeg/libavcodec/motion_est.c +++ b/src/ExtLib/ffmpeg/libavcodec/motion_est.c @@ -1454,7 +1454,7 @@ static inline int direct_search(MpegEncContext * s, int mb_x, int mb_y) s->b_direct_mv_table[mot_xy][0]= 0; s->b_direct_mv_table[mot_xy][1]= 0; - return 256*256*256*64; + return 256*256*256*64-1; } c->xmin= xmin; diff --git a/src/ExtLib/ffmpeg/libavcodec/packet.c b/src/ExtLib/ffmpeg/libavcodec/packet.c index e118bbaad1..032f270777 100644 --- a/src/ExtLib/ffmpeg/libavcodec/packet.c +++ b/src/ExtLib/ffmpeg/libavcodec/packet.c @@ -305,6 +305,7 @@ const char *av_packet_side_data_name(enum AVPacketSideDataType type) case AV_PKT_DATA_IAMF_MIX_GAIN_PARAM: return "IAMF Mix Gain Parameter Data"; case AV_PKT_DATA_IAMF_DEMIXING_INFO_PARAM: return "IAMF Demixing Info Parameter Data"; case AV_PKT_DATA_IAMF_RECON_GAIN_INFO_PARAM: return "IAMF Recon Gain Info Parameter Data"; + case AV_PKT_DATA_FRAME_CROPPING: return "Frame Cropping"; } return NULL; } diff --git a/src/ExtLib/ffmpeg/libavcodec/packet.h b/src/ExtLib/ffmpeg/libavcodec/packet.h index f05deb7950..13667ffa36 100644 --- a/src/ExtLib/ffmpeg/libavcodec/packet.h +++ b/src/ExtLib/ffmpeg/libavcodec/packet.h @@ -326,6 +326,19 @@ enum AVPacketSideDataType { */ AV_PKT_DATA_AMBIENT_VIEWING_ENVIRONMENT, + /** + * The number of pixels to discard from the top/bottom/left/right border of the + * decoded frame to obtain the sub-rectangle intended for presentation. + * + * @code + * u32le crop_top + * u32le crop_bottom + * u32le crop_left + * u32le crop_right + * @endcode + */ + AV_PKT_DATA_FRAME_CROPPING, + /** * The number of side data types. * This is not part of the public API/ABI in the sense that it may diff --git a/src/ExtLib/ffmpeg/libavcodec/version.h b/src/ExtLib/ffmpeg/libavcodec/version.h index 230d5fa13e..80e2ae630d 100644 --- a/src/ExtLib/ffmpeg/libavcodec/version.h +++ b/src/ExtLib/ffmpeg/libavcodec/version.h @@ -29,7 +29,7 @@ #include "version_major.h" -#define LIBAVCODEC_VERSION_MINOR 9 +#define LIBAVCODEC_VERSION_MINOR 10 #define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ diff --git a/src/ExtLib/ffmpeg/libavcodec/vvc/refs.c b/src/ExtLib/ffmpeg/libavcodec/vvc/refs.c index 26a5b0b34c..c1fc6132c2 100644 --- a/src/ExtLib/ffmpeg/libavcodec/vvc/refs.c +++ b/src/ExtLib/ffmpeg/libavcodec/vvc/refs.c @@ -310,7 +310,7 @@ void ff_vvc_bump_frame(VVCContext *s, VVCFrameContext *fc) static VVCFrame *find_ref_idx(VVCContext *s, VVCFrameContext *fc, int poc, uint8_t use_msb) { - const int mask = use_msb ? ~0 : fc->ps.sps->max_pic_order_cnt_lsb - 1; + const unsigned mask = use_msb ? ~0 : fc->ps.sps->max_pic_order_cnt_lsb - 1; for (int i = 0; i < FF_ARRAY_ELEMS(fc->DPB); i++) { VVCFrame *ref = &fc->DPB[i]; diff --git a/src/ExtLib/ffmpeg/libavcodec/vvc/thread.c b/src/ExtLib/ffmpeg/libavcodec/vvc/thread.c index 0cacb1f51c..8dd9a36fd5 100644 --- a/src/ExtLib/ffmpeg/libavcodec/vvc/thread.c +++ b/src/ExtLib/ffmpeg/libavcodec/vvc/thread.c @@ -565,7 +565,7 @@ static void task_run_stage(VVCTask *t, VVCContext *s, VVCLocalContext *lc) VVCFrameContext *fc = t->fc; VVCFrameThread *ft = fc->ft; const VVCTaskStage stage = t->stage; - run_func run[] = { + static const run_func run[] = { run_parse, run_inter, run_recon, diff --git a/src/ExtLib/ffmpeg/libavfilter/af_aresample.c b/src/ExtLib/ffmpeg/libavfilter/af_aresample.c index d6bd77beb3..8ff2fe5973 100644 --- a/src/ExtLib/ffmpeg/libavfilter/af_aresample.c +++ b/src/ExtLib/ffmpeg/libavfilter/af_aresample.c @@ -195,8 +195,11 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamplesref) av_frame_copy_props(outsamplesref, insamplesref); outsamplesref->format = outlink->format; ret = av_channel_layout_copy(&outsamplesref->ch_layout, &outlink->ch_layout); - if (ret < 0) + if (ret < 0) { + av_frame_free(&outsamplesref); + av_frame_free(&insamplesref); return ret; + } outsamplesref->sample_rate = outlink->sample_rate; if(insamplesref->pts != AV_NOPTS_VALUE) { diff --git a/src/ExtLib/ffmpeg/libavutil/executor.c b/src/ExtLib/ffmpeg/libavutil/executor.c index fb20104b58..bfce2ac444 100644 --- a/src/ExtLib/ffmpeg/libavutil/executor.c +++ b/src/ExtLib/ffmpeg/libavutil/executor.c @@ -20,6 +20,8 @@ #include "config.h" +#include + #include "mem.h" #include "thread.h" @@ -49,6 +51,7 @@ typedef struct ThreadInfo { struct AVExecutor { AVTaskCallbacks cb; int thread_count; + bool recursive; ThreadInfo *threads; uint8_t *local_contexts; @@ -194,18 +197,25 @@ void av_executor_execute(AVExecutor *e, AVTask *t) AVTaskCallbacks *cb = &e->cb; AVTask **prev; - ff_mutex_lock(&e->lock); + if (e->thread_count) + ff_mutex_lock(&e->lock); if (t) { for (prev = &e->tasks; *prev && cb->priority_higher(*prev, t); prev = &(*prev)->next) /* nothing */; add_task(prev, t); } - ff_cond_signal(&e->cond); - ff_mutex_unlock(&e->lock); + if (e->thread_count) { + ff_cond_signal(&e->cond); + ff_mutex_unlock(&e->lock); + } if (!e->thread_count || !HAVE_THREADS) { + if (e->recursive) + return; + e->recursive = true; // We are running in a single-threaded environment, so we must handle all tasks ourselves while (run_one_task(e, e->local_contexts)) /* nothing */; + e->recursive = false; } } diff --git a/src/ExtLib/ffmpeg/libavutil/hwcontext_d3d11va.c b/src/ExtLib/ffmpeg/libavutil/hwcontext_d3d11va.c index fbed02320e..4bb62f114e 100644 --- a/src/ExtLib/ffmpeg/libavutil/hwcontext_d3d11va.c +++ b/src/ExtLib/ffmpeg/libavutil/hwcontext_d3d11va.c @@ -200,6 +200,7 @@ static AVBufferRef *wrap_texture_buf(AVHWFramesContext *ctx, ID3D11Texture2D *te sizeof(*frames_hwctx->texture_infos)); if (!frames_hwctx->texture_infos) { ID3D11Texture2D_Release(tex); + av_free(desc); return NULL; } s->nb_surfaces = s->nb_surfaces_used + 1; @@ -212,7 +213,7 @@ static AVBufferRef *wrap_texture_buf(AVHWFramesContext *ctx, ID3D11Texture2D *te desc->texture = tex; desc->index = index; - buf = av_buffer_create((uint8_t *)desc, sizeof(desc), free_texture, tex, 0); + buf = av_buffer_create((uint8_t *)desc, sizeof(*desc), free_texture, tex, 0); if (!buf) { ID3D11Texture2D_Release(tex); av_free(desc); diff --git a/src/ExtLib/ffmpeg/libavutil/hwcontext_dxva2.c b/src/ExtLib/ffmpeg/libavutil/hwcontext_dxva2.c index 1136bacf21..7ec0b03aad 100644 --- a/src/ExtLib/ffmpeg/libavutil/hwcontext_dxva2.c +++ b/src/ExtLib/ffmpeg/libavutil/hwcontext_dxva2.c @@ -155,7 +155,7 @@ static AVBufferRef *dxva2_pool_alloc(void *opaque, size_t size) if (s->nb_surfaces_used < hwctx->nb_surfaces) { s->nb_surfaces_used++; return av_buffer_create((uint8_t*)s->surfaces_internal[s->nb_surfaces_used - 1], - sizeof(*hwctx->surfaces), dxva2_pool_release_dummy, 0, 0); + sizeof(**hwctx->surfaces), dxva2_pool_release_dummy, 0, 0); } return NULL; diff --git a/src/ExtLib/ffmpeg/libavutil/imgutils.c b/src/ExtLib/ffmpeg/libavutil/imgutils.c index 3992d3b643..8aa7159741 100644 --- a/src/ExtLib/ffmpeg/libavutil/imgutils.c +++ b/src/ExtLib/ffmpeg/libavutil/imgutils.c @@ -298,7 +298,7 @@ int av_image_check_size2(unsigned int w, unsigned int h, int64_t max_pixels, enu stride = 8LL*w; stride += 128*8; - if ((int)w<=0 || (int)h<=0 || stride >= INT_MAX || stride*(uint64_t)(h+128) >= INT_MAX) { + if (w==0 || h==0 || w > INT32_MAX || h > INT32_MAX || stride >= INT_MAX || stride*(h + 128ULL) >= INT_MAX) { av_log(&imgutils, AV_LOG_ERROR, "Picture size %ux%u is invalid\n", w, h); return AVERROR(EINVAL); } diff --git a/src/ExtLib/ffmpeg/libavutil/wchar_filename.h b/src/ExtLib/ffmpeg/libavutil/wchar_filename.h index 8794f07983..9ba0cbf0b7 100644 --- a/src/ExtLib/ffmpeg/libavutil/wchar_filename.h +++ b/src/ExtLib/ffmpeg/libavutil/wchar_filename.h @@ -57,7 +57,7 @@ static inline int wchartocp(unsigned int code_page, const wchar_t *filename_w, errno = EINVAL; return -1; } - *filename = (char*)av_malloc_array(num_chars, sizeof *filename); + *filename = (char*)av_malloc_array(num_chars, sizeof **filename); if (!*filename) { errno = ENOMEM; return -1; diff --git a/src/ExtLib/ffmpeg/libavutil/x86/intreadwrite.h b/src/ExtLib/ffmpeg/libavutil/x86/intreadwrite.h index 5e57d6a8cd..65cc6b39a1 100644 --- a/src/ExtLib/ffmpeg/libavutil/x86/intreadwrite.h +++ b/src/ExtLib/ffmpeg/libavutil/x86/intreadwrite.h @@ -23,41 +23,27 @@ #include #include "config.h" +#if HAVE_INTRINSICS_SSE2 && defined(__SSE2__) +#include +#endif #include "libavutil/attributes.h" -#if HAVE_MMX - -#ifdef __SSE__ +#if HAVE_INTRINSICS_SSE2 && defined(__SSE2__) #define AV_COPY128 AV_COPY128 static av_always_inline void AV_COPY128(void *d, const void *s) { - struct v {uint64_t v[2];}; - - __asm__("movaps %1, %%xmm0 \n\t" - "movaps %%xmm0, %0 \n\t" - : "=m"(*(struct v*)d) - : "m" (*(const struct v*)s) - : "xmm0"); + __m128i tmp = _mm_load_si128((const __m128i *)s); + _mm_store_si128((__m128i *)d, tmp); } -#endif /* __SSE__ */ - -#ifdef __SSE2__ - #define AV_ZERO128 AV_ZERO128 static av_always_inline void AV_ZERO128(void *d) { - struct v {uint64_t v[2];}; - - __asm__("pxor %%xmm0, %%xmm0 \n\t" - "movdqa %%xmm0, %0 \n\t" - : "=m"(*(struct v*)d) - :: "xmm0"); + __m128i zero = _mm_setzero_si128(); + _mm_store_si128((__m128i *)d, zero); } -#endif /* __SSE2__ */ - -#endif /* HAVE_MMX */ +#endif /* HAVE_INTRINSICS_SSE2 && defined(__SSE2__) */ #endif /* AVUTIL_X86_INTREADWRITE_H */ diff --git a/src/ExtLib/ffmpeg/libswscale/swscale.c b/src/ExtLib/ffmpeg/libswscale/swscale.c index 9736734881..df0d5708aa 100644 --- a/src/ExtLib/ffmpeg/libswscale/swscale.c +++ b/src/ExtLib/ffmpeg/libswscale/swscale.c @@ -1175,7 +1175,7 @@ int sws_receive_slice(struct SwsContext *c, unsigned int slice_start, } for (int i = 0; i < FF_ARRAY_ELEMS(dst); i++) { - ptrdiff_t offset = c->frame_dst->linesize[i] * (slice_start >> c->chrDstVSubSample); + ptrdiff_t offset = c->frame_dst->linesize[i] * (ptrdiff_t)(slice_start >> c->chrDstVSubSample); dst[i] = FF_PTR_ADD(c->frame_dst->data[i], offset); } @@ -1236,7 +1236,7 @@ void ff_sws_slice_worker(void *priv, int jobnr, int threadnr, for (int i = 0; i < FF_ARRAY_ELEMS(dst) && parent->frame_dst->data[i]; i++) { const int vshift = (i == 1 || i == 2) ? c->chrDstVSubSample : 0; const ptrdiff_t offset = parent->frame_dst->linesize[i] * - ((slice_start + parent->dst_slice_start) >> vshift); + (ptrdiff_t)((slice_start + parent->dst_slice_start) >> vshift); dst[i] = parent->frame_dst->data[i] + offset; } diff --git a/src/ExtLib/ffmpeg/libswscale/swscale_internal.h b/src/ExtLib/ffmpeg/libswscale/swscale_internal.h index 0818f50c7f..e5610161d0 100644 --- a/src/ExtLib/ffmpeg/libswscale/swscale_internal.h +++ b/src/ExtLib/ffmpeg/libswscale/swscale_internal.h @@ -46,8 +46,6 @@ #define MAX_FILTER_SIZE SWS_MAX_FILTER_SIZE -#define DITHER1XBPP - #if HAVE_BIGENDIAN #define ALT32_CORR (-1) #else diff --git a/src/ExtLib/ffmpeg/libswscale/utils.c b/src/ExtLib/ffmpeg/libswscale/utils.c index 12dba712c1..bc8d7627e2 100644 --- a/src/ExtLib/ffmpeg/libswscale/utils.c +++ b/src/ExtLib/ffmpeg/libswscale/utils.c @@ -1952,14 +1952,10 @@ static av_cold int sws_init_single_context(SwsContext *c, SwsFilter *srcFilter, av_log(c, AV_LOG_INFO, "%s scaler, from %s to %s%s ", scaler, av_get_pix_fmt_name(srcFormat), -#ifdef DITHER1XBPP dstFormat == AV_PIX_FMT_BGR555 || dstFormat == AV_PIX_FMT_BGR565 || dstFormat == AV_PIX_FMT_RGB444BE || dstFormat == AV_PIX_FMT_RGB444LE || dstFormat == AV_PIX_FMT_BGR444BE || dstFormat == AV_PIX_FMT_BGR444LE ? "dithered " : "", -#else - "", -#endif av_get_pix_fmt_name(dstFormat)); if (INLINE_MMXEXT(cpu_flags)) diff --git a/src/ExtLib/ffmpeg/libswscale/x86/swscale.c b/src/ExtLib/ffmpeg/libswscale/x86/swscale.c index ad7f67f90e..43319fd6b2 100644 --- a/src/ExtLib/ffmpeg/libswscale/x86/swscale.c +++ b/src/ExtLib/ffmpeg/libswscale/x86/swscale.c @@ -40,8 +40,6 @@ const DECLARE_ALIGNED(8, uint64_t, ff_dither8)[2] = { #if HAVE_INLINE_ASM -#define DITHER1XBPP - DECLARE_ASM_CONST(8, uint64_t, bF8)= 0xF8F8F8F8F8F8F8F8LL; DECLARE_ASM_CONST(8, uint64_t, bFC)= 0xFCFCFCFCFCFCFCFCLL; diff --git a/src/ExtLib/ffmpeg/libswscale/x86/swscale_template.c b/src/ExtLib/ffmpeg/libswscale/x86/swscale_template.c index 6190fcb4fe..6bff2a44aa 100644 --- a/src/ExtLib/ffmpeg/libswscale/x86/swscale_template.c +++ b/src/ExtLib/ffmpeg/libswscale/x86/swscale_template.c @@ -384,11 +384,9 @@ static void RENAME(yuv2rgb565_X_ar)(SwsContext *c, const int16_t *lumFilter, YSCALEYUV2RGBX "pxor %%mm7, %%mm7 \n\t" /* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */ -#ifdef DITHER1XBPP "paddusb "BLUE_DITHER"(%0), %%mm2\n\t" "paddusb "GREEN_DITHER"(%0), %%mm4\n\t" "paddusb "RED_DITHER"(%0), %%mm5\n\t" -#endif WRITERGB16(%4, "%5", %%FF_REGa) YSCALEYUV2PACKEDX_END } @@ -408,11 +406,9 @@ static void RENAME(yuv2rgb565_X)(SwsContext *c, const int16_t *lumFilter, YSCALEYUV2RGBX "pxor %%mm7, %%mm7 \n\t" /* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */ -#ifdef DITHER1XBPP "paddusb "BLUE_DITHER"(%0), %%mm2 \n\t" "paddusb "GREEN_DITHER"(%0), %%mm4 \n\t" "paddusb "RED_DITHER"(%0), %%mm5 \n\t" -#endif WRITERGB16(%4, "%5", %%FF_REGa) YSCALEYUV2PACKEDX_END } @@ -461,11 +457,9 @@ static void RENAME(yuv2rgb555_X_ar)(SwsContext *c, const int16_t *lumFilter, YSCALEYUV2RGBX "pxor %%mm7, %%mm7 \n\t" /* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */ -#ifdef DITHER1XBPP "paddusb "BLUE_DITHER"(%0), %%mm2\n\t" "paddusb "GREEN_DITHER"(%0), %%mm4\n\t" "paddusb "RED_DITHER"(%0), %%mm5\n\t" -#endif WRITERGB15(%4, "%5", %%FF_REGa) YSCALEYUV2PACKEDX_END } @@ -485,11 +479,9 @@ static void RENAME(yuv2rgb555_X)(SwsContext *c, const int16_t *lumFilter, YSCALEYUV2RGBX "pxor %%mm7, %%mm7 \n\t" /* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */ -#ifdef DITHER1XBPP "paddusb "BLUE_DITHER"(%0), %%mm2 \n\t" "paddusb "GREEN_DITHER"(%0), %%mm4 \n\t" "paddusb "RED_DITHER"(%0), %%mm5 \n\t" -#endif WRITERGB15(%4, "%5", %%FF_REGa) YSCALEYUV2PACKEDX_END } @@ -891,11 +883,9 @@ static void RENAME(yuv2rgb555_2)(SwsContext *c, const int16_t *buf[2], YSCALEYUV2RGB(%%FF_REGBP, %5) "pxor %%mm7, %%mm7 \n\t" /* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */ -#ifdef DITHER1XBPP "paddusb "BLUE_DITHER"(%5), %%mm2 \n\t" "paddusb "GREEN_DITHER"(%5), %%mm4 \n\t" "paddusb "RED_DITHER"(%5), %%mm5 \n\t" -#endif WRITERGB15(%%FF_REGb, DSTW_OFFSET"(%5)", %%FF_REGBP) "pop %%"FF_REG_BP" \n\t" "mov "ESP_OFFSET"(%5), %%"FF_REG_b" \n\t" @@ -920,11 +910,9 @@ static void RENAME(yuv2rgb565_2)(SwsContext *c, const int16_t *buf[2], YSCALEYUV2RGB(%%FF_REGBP, %5) "pxor %%mm7, %%mm7 \n\t" /* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */ -#ifdef DITHER1XBPP "paddusb "BLUE_DITHER"(%5), %%mm2 \n\t" "paddusb "GREEN_DITHER"(%5), %%mm4 \n\t" "paddusb "RED_DITHER"(%5), %%mm5 \n\t" -#endif WRITERGB16(%%FF_REGb, DSTW_OFFSET"(%5)", %%FF_REGBP) "pop %%"FF_REG_BP" \n\t" "mov "ESP_OFFSET"(%5), %%"FF_REG_b" \n\t" @@ -1240,11 +1228,9 @@ static void RENAME(yuv2rgb555_1)(SwsContext *c, const int16_t *buf0, YSCALEYUV2RGB1(%%FF_REGBP, %5) "pxor %%mm7, %%mm7 \n\t" /* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */ -#ifdef DITHER1XBPP "paddusb "BLUE_DITHER"(%5), %%mm2 \n\t" "paddusb "GREEN_DITHER"(%5), %%mm4 \n\t" "paddusb "RED_DITHER"(%5), %%mm5 \n\t" -#endif WRITERGB15(%%FF_REGb, DSTW_OFFSET"(%5)", %%FF_REGBP) "pop %%"FF_REG_BP" \n\t" "mov "ESP_OFFSET"(%5), %%"FF_REG_b" \n\t" @@ -1261,11 +1247,9 @@ static void RENAME(yuv2rgb555_1)(SwsContext *c, const int16_t *buf0, YSCALEYUV2RGB1b(%%FF_REGBP, %5) "pxor %%mm7, %%mm7 \n\t" /* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */ -#ifdef DITHER1XBPP "paddusb "BLUE_DITHER"(%5), %%mm2 \n\t" "paddusb "GREEN_DITHER"(%5), %%mm4 \n\t" "paddusb "RED_DITHER"(%5), %%mm5 \n\t" -#endif WRITERGB15(%%FF_REGb, DSTW_OFFSET"(%5)", %%FF_REGBP) "pop %%"FF_REG_BP" \n\t" "mov "ESP_OFFSET"(%5), %%"FF_REG_b" \n\t" @@ -1293,11 +1277,9 @@ static void RENAME(yuv2rgb565_1)(SwsContext *c, const int16_t *buf0, YSCALEYUV2RGB1(%%FF_REGBP, %5) "pxor %%mm7, %%mm7 \n\t" /* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */ -#ifdef DITHER1XBPP "paddusb "BLUE_DITHER"(%5), %%mm2 \n\t" "paddusb "GREEN_DITHER"(%5), %%mm4 \n\t" "paddusb "RED_DITHER"(%5), %%mm5 \n\t" -#endif WRITERGB16(%%FF_REGb, DSTW_OFFSET"(%5)", %%FF_REGBP) "pop %%"FF_REG_BP" \n\t" "mov "ESP_OFFSET"(%5), %%"FF_REG_b" \n\t" @@ -1314,11 +1296,9 @@ static void RENAME(yuv2rgb565_1)(SwsContext *c, const int16_t *buf0, YSCALEYUV2RGB1b(%%FF_REGBP, %5) "pxor %%mm7, %%mm7 \n\t" /* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */ -#ifdef DITHER1XBPP "paddusb "BLUE_DITHER"(%5), %%mm2 \n\t" "paddusb "GREEN_DITHER"(%5), %%mm4 \n\t" "paddusb "RED_DITHER"(%5), %%mm5 \n\t" -#endif WRITERGB16(%%FF_REGb, DSTW_OFFSET"(%5)", %%FF_REGBP) "pop %%"FF_REG_BP" \n\t" "mov "ESP_OFFSET"(%5), %%"FF_REG_b" \n\t" diff --git a/src/ExtLib/ffmpeg/libswscale/x86/yuv2rgb.c b/src/ExtLib/ffmpeg/libswscale/x86/yuv2rgb.c index 41dfa80f33..68e903c6ad 100644 --- a/src/ExtLib/ffmpeg/libswscale/x86/yuv2rgb.c +++ b/src/ExtLib/ffmpeg/libswscale/x86/yuv2rgb.c @@ -1,7 +1,8 @@ /* * software YUV to RGB converter * - * Copyright (C) 2009 Konstantin Shishkov + * Copyright (C) 2001-2007 Michael Niedermayer + * Copyright (C) 2009-2010 Konstantin Shishkov * * MMX/MMXEXT template stuff (needed for fast movntq support), * 1,4,8bpp support and context / deglobalize stuff @@ -39,12 +40,166 @@ #if HAVE_X86ASM -#define DITHER1XBPP // only for MMX +#define YUV2RGB_LOOP(depth) \ + h_size = (c->dstW + 7) & ~7; \ + if (h_size * depth > FFABS(dstStride[0])) \ + h_size -= 8; \ + \ + vshift = c->srcFormat != AV_PIX_FMT_YUV422P; \ + \ + for (y = 0; y < srcSliceH; y++) { \ + uint8_t *image = dst[0] + (y + srcSliceY) * dstStride[0]; \ + const uint8_t *py = src[0] + y * srcStride[0]; \ + const uint8_t *pu = src[1] + (y >> vshift) * srcStride[1]; \ + const uint8_t *pv = src[2] + (y >> vshift) * srcStride[2]; \ + x86_reg index = -h_size / 2; \ -//SSSE3 versions -#undef RENAME -#define RENAME(a) a ## _ssse3 -#include "yuv2rgb_template.c" +extern void ff_yuv_420_rgb24_ssse3(x86_reg index, uint8_t *image, const uint8_t *pu_index, + const uint8_t *pv_index, const uint64_t *pointer_c_dither, + const uint8_t *py_2index); +extern void ff_yuv_420_bgr24_ssse3(x86_reg index, uint8_t *image, const uint8_t *pu_index, + const uint8_t *pv_index, const uint64_t *pointer_c_dither, + const uint8_t *py_2index); + +extern void ff_yuv_420_rgb15_ssse3(x86_reg index, uint8_t *image, const uint8_t *pu_index, + const uint8_t *pv_index, const uint64_t *pointer_c_dither, + const uint8_t *py_2index); +extern void ff_yuv_420_rgb16_ssse3(x86_reg index, uint8_t *image, const uint8_t *pu_index, + const uint8_t *pv_index, const uint64_t *pointer_c_dither, + const uint8_t *py_2index); +extern void ff_yuv_420_rgb32_ssse3(x86_reg index, uint8_t *image, const uint8_t *pu_index, + const uint8_t *pv_index, const uint64_t *pointer_c_dither, + const uint8_t *py_2index); +extern void ff_yuv_420_bgr32_ssse3(x86_reg index, uint8_t *image, const uint8_t *pu_index, + const uint8_t *pv_index, const uint64_t *pointer_c_dither, + const uint8_t *py_2index); +extern void ff_yuva_420_rgb32_ssse3(x86_reg index, uint8_t *image, const uint8_t *pu_index, + const uint8_t *pv_index, const uint64_t *pointer_c_dither, + const uint8_t *py_2index, const uint8_t *pa_2index); +extern void ff_yuva_420_bgr32_ssse3(x86_reg index, uint8_t *image, const uint8_t *pu_index, + const uint8_t *pv_index, const uint64_t *pointer_c_dither, + const uint8_t *py_2index, const uint8_t *pa_2index); + +static inline int yuv420_rgb15_ssse3(SwsContext *c, const uint8_t *src[], + int srcStride[], + int srcSliceY, int srcSliceH, + uint8_t *dst[], int dstStride[]) +{ + int y, h_size, vshift; + + YUV2RGB_LOOP(2) + + c->blueDither = ff_dither8[y & 1]; + c->greenDither = ff_dither8[y & 1]; + c->redDither = ff_dither8[(y + 1) & 1]; + + ff_yuv_420_rgb15_ssse3(index, image, pu - index, pv - index, &(c->redDither), py - 2 * index); + } + return srcSliceH; +} + +static inline int yuv420_rgb16_ssse3(SwsContext *c, const uint8_t *src[], + int srcStride[], + int srcSliceY, int srcSliceH, + uint8_t *dst[], int dstStride[]) +{ + int y, h_size, vshift; + + YUV2RGB_LOOP(2) + + c->blueDither = ff_dither8[y & 1]; + c->greenDither = ff_dither4[y & 1]; + c->redDither = ff_dither8[(y + 1) & 1]; + + ff_yuv_420_rgb16_ssse3(index, image, pu - index, pv - index, &(c->redDither), py - 2 * index); + } + return srcSliceH; +} + +static inline int yuv420_rgb32_ssse3(SwsContext *c, const uint8_t *src[], + int srcStride[], + int srcSliceY, int srcSliceH, + uint8_t *dst[], int dstStride[]) +{ + int y, h_size, vshift; + + YUV2RGB_LOOP(4) + + ff_yuv_420_rgb32_ssse3(index, image, pu - index, pv - index, &(c->redDither), py - 2 * index); + } + return srcSliceH; +} + +static inline int yuv420_bgr32_ssse3(SwsContext *c, const uint8_t *src[], + int srcStride[], + int srcSliceY, int srcSliceH, + uint8_t *dst[], int dstStride[]) +{ + int y, h_size, vshift; + + YUV2RGB_LOOP(4) + + ff_yuv_420_bgr32_ssse3(index, image, pu - index, pv - index, &(c->redDither), py - 2 * index); + } + return srcSliceH; +} + +static inline int yuva420_rgb32_ssse3(SwsContext *c, const uint8_t *src[], + int srcStride[], + int srcSliceY, int srcSliceH, + uint8_t *dst[], int dstStride[]) +{ + int y, h_size, vshift; + YUV2RGB_LOOP(4) + + const uint8_t *pa = src[3] + y * srcStride[3]; + ff_yuva_420_rgb32_ssse3(index, image, pu - index, pv - index, &(c->redDither), py - 2 * index, pa - 2 * index); + } + return srcSliceH; +} + +static inline int yuva420_bgr32_ssse3(SwsContext *c, const uint8_t *src[], + int srcStride[], + int srcSliceY, int srcSliceH, + uint8_t *dst[], int dstStride[]) +{ + int y, h_size, vshift; + + YUV2RGB_LOOP(4) + + const uint8_t *pa = src[3] + y * srcStride[3]; + ff_yuva_420_bgr32_ssse3(index, image, pu - index, pv - index, &(c->redDither), py - 2 * index, pa - 2 * index); + } + return srcSliceH; +} + +static inline int yuv420_rgb24_ssse3(SwsContext *c, const uint8_t *src[], + int srcStride[], + int srcSliceY, int srcSliceH, + uint8_t *dst[], int dstStride[]) +{ + int y, h_size, vshift; + + YUV2RGB_LOOP(3) + + ff_yuv_420_rgb24_ssse3(index, image, pu - index, pv - index, &(c->redDither), py - 2 * index); + } + return srcSliceH; +} + +static inline int yuv420_bgr24_ssse3(SwsContext *c, const uint8_t *src[], + int srcStride[], + int srcSliceY, int srcSliceH, + uint8_t *dst[], int dstStride[]) +{ + int y, h_size, vshift; + + YUV2RGB_LOOP(3) + + ff_yuv_420_bgr24_ssse3(index, image, pu - index, pv - index, &(c->redDither), py - 2 * index); + } + return srcSliceH; +} #endif /* HAVE_X86ASM */ diff --git a/src/ExtLib/ffmpeg/libswscale/yuv2rgb.c b/src/ExtLib/ffmpeg/libswscale/yuv2rgb.c index 977eb3a7dd..cfbc54abd0 100644 --- a/src/ExtLib/ffmpeg/libswscale/yuv2rgb.c +++ b/src/ExtLib/ffmpeg/libswscale/yuv2rgb.c @@ -100,9 +100,9 @@ const int *sws_getCoefficients(int colorspace) #define PUTRGBA(dst, ysrc, asrc, i, abase) \ Y = ysrc[2 * i]; \ - dst[2 * i] = r[Y] + g[Y] + b[Y] + (asrc[2 * i] << abase); \ + dst[2 * i] = r[Y] + g[Y] + b[Y] + ((uint32_t)(asrc[2 * i]) << abase); \ Y = ysrc[2 * i + 1]; \ - dst[2 * i + 1] = r[Y] + g[Y] + b[Y] + (asrc[2 * i + 1] << abase); + dst[2 * i + 1] = r[Y] + g[Y] + b[Y] + ((uint32_t)(asrc[2 * i + 1]) << abase); #define PUTRGB48(dst, src, asrc, i, abase) \ Y = src[ 2 * i]; \