diff --git a/docs/Changelog.Rus.txt b/docs/Changelog.Rus.txt index 83e8ab6855..79ee3ee535 100644 --- a/docs/Changelog.Rus.txt +++ b/docs/Changelog.Rus.txt @@ -19,7 +19,7 @@ MPCVideoDec Обновлен японский перевод (автор tsubasanouta). Обновлены библиотеки: - ffmpeg n7.1-dev-1585-g0b330d8642; + ffmpeg n7.1-dev-1688-ge0eff64ed1; vvdec v2.3.0-24-gad8f4bb. diff --git a/docs/Changelog.txt b/docs/Changelog.txt index 3ca19c5ff0..aedc8b284f 100644 --- a/docs/Changelog.txt +++ b/docs/Changelog.txt @@ -19,7 +19,7 @@ Updated Korean translation (by Hackjjang). Updated Japanese translation (by tsubasanouta). Updated libraries: - ffmpeg n7.1-dev-1585-g0b330d8642; + ffmpeg n7.1-dev-1688-ge0eff64ed1; vvdec v2.3.0-24-gad8f4bb. diff --git a/src/ExtLib/ffmpeg/libavcodec/aac/aacdec_usac.c b/src/ExtLib/ffmpeg/libavcodec/aac/aacdec_usac.c index 4856c1786b..32b3c534bf 100644 --- a/src/ExtLib/ffmpeg/libavcodec/aac/aacdec_usac.c +++ b/src/ExtLib/ffmpeg/libavcodec/aac/aacdec_usac.c @@ -1134,7 +1134,7 @@ static void complex_stereo_downmix_cur(AACDecContext *ac, ChannelElement *cpe, } } -static void complex_stereo_interpolate_imag(float *im, float *re, const float f[6], +static void complex_stereo_interpolate_imag(float *im, float *re, const float f[7], int len, int factor_even, int factor_odd) { int i = 0; diff --git a/src/ExtLib/ffmpeg/libavcodec/aacsbr_template.c b/src/ExtLib/ffmpeg/libavcodec/aacsbr_template.c index 8bda251213..a729b7af38 100644 --- a/src/ExtLib/ffmpeg/libavcodec/aacsbr_template.c +++ b/src/ExtLib/ffmpeg/libavcodec/aacsbr_template.c @@ -1273,8 +1273,6 @@ int ff_aac_sbr_decode_usac_data(AACDecContext *ac, ChannelElement *che, sbr->ready_for_dequant = 1; - int start = get_bits_count(gb); - if (sbr_ch == 1) { /* sbr_single_channel_element */ /* if (harmonicSBR) ... */ diff --git a/src/ExtLib/ffmpeg/libavcodec/allcodecs.c b/src/ExtLib/ffmpeg/libavcodec/allcodecs.c index b6ee47549a..9cb43e9222 100644 --- a/src/ExtLib/ffmpeg/libavcodec/allcodecs.c +++ b/src/ExtLib/ffmpeg/libavcodec/allcodecs.c @@ -852,6 +852,7 @@ extern const FFCodec ff_h264_vaapi_encoder; extern const FFCodec ff_h264_videotoolbox_encoder; extern const FFCodec ff_hevc_amf_encoder; extern const FFCodec ff_hevc_cuvid_decoder; +extern const FFCodec ff_hevc_d3d12va_encoder; extern const FFCodec ff_hevc_mediacodec_decoder; extern const FFCodec ff_hevc_mediacodec_encoder; extern const FFCodec ff_hevc_mf_encoder; diff --git a/src/ExtLib/ffmpeg/libavcodec/hevc/hevcdec.c b/src/ExtLib/ffmpeg/libavcodec/hevc/hevcdec.c index e75768f303..988f242331 100644 --- a/src/ExtLib/ffmpeg/libavcodec/hevc/hevcdec.c +++ b/src/ExtLib/ffmpeg/libavcodec/hevc/hevcdec.c @@ -550,8 +550,7 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps) return ff_get_format(s->avctx, pix_fmts); } -static int set_sps(HEVCContext *s, const HEVCSPS *sps, - enum AVPixelFormat pix_fmt) +static int set_sps(HEVCContext *s, const HEVCSPS *sps) { int ret, i; @@ -566,10 +565,6 @@ static int set_sps(HEVCContext *s, const HEVCSPS *sps, if (ret < 0) goto fail; - export_stream_params(s, sps); - - s->avctx->pix_fmt = pix_fmt; - ff_hevc_pred_init(&s->hpc, sps->bit_depth); ff_hevc_dsp_init (&s->hevcdsp, sps->bit_depth); ff_videodsp_init (&s->vdsp, sps->bit_depth); @@ -632,7 +627,7 @@ static int hls_slice_header(SliceHeader *sh, const HEVCContext *s, GetBitContext av_log(s->avctx, AV_LOG_ERROR, "PPS id out of range: %d\n", pps_id); return AVERROR_INVALIDDATA; } - if (!sh->first_slice_in_pic_flag && pps_id != sh->pps_id) { + if (!sh->first_slice_in_pic_flag && s->ps.pps_list[pps_id] != s->pps) { av_log(s->avctx, AV_LOG_ERROR, "PPS changed between slices.\n"); return AVERROR_INVALIDDATA; } @@ -2950,10 +2945,12 @@ static int hevc_frame_start(HEVCContext *s) ff_hevc_clear_refs(s); - ret = set_sps(s, sps, sps->pix_fmt); + ret = set_sps(s, sps); if (ret < 0) return ret; + export_stream_params(s, sps); + pix_fmt = get_format(s, sps); if (pix_fmt < 0) return pix_fmt; @@ -2996,6 +2993,10 @@ static int hevc_frame_start(HEVCContext *s) if (pps->tiles_enabled_flag) s->local_ctx[0].end_of_tiles_x = pps->column_width[0] << sps->log2_ctb_size; + ret = export_stream_params_from_sei(s); + if (ret < 0) + return ret; + ret = ff_hevc_set_new_ref(s, s->poc); if (ret < 0) goto fail; @@ -3016,10 +3017,6 @@ static int hevc_frame_start(HEVCContext *s) !(s->avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN) && !s->avctx->hwaccel; - ret = export_stream_params_from_sei(s); - if (ret < 0) - return ret; - ret = set_side_data(s); if (ret < 0) goto fail; @@ -3624,7 +3621,7 @@ static int hevc_update_thread_context(AVCodecContext *dst, ff_refstruct_unref(&s->pps); if (s->ps.sps != s0->ps.sps) - if ((ret = set_sps(s, s0->ps.sps, src->pix_fmt)) < 0) + if ((ret = set_sps(s, s0->ps.sps)) < 0) return ret; s->seq_decode = s0->seq_decode; @@ -3669,10 +3666,6 @@ static int hevc_update_thread_context(AVCodecContext *dst, s->sei.common.content_light = s0->sei.common.content_light; s->sei.common.aom_film_grain = s0->sei.common.aom_film_grain; - ret = export_stream_params_from_sei(s); - if (ret < 0) - return ret; - return 0; } #endif diff --git a/src/ExtLib/ffmpeg/libavcodec/mpeg12dec.c b/src/ExtLib/ffmpeg/libavcodec/mpeg12dec.c index 74946aeaab..3483587146 100644 --- a/src/ExtLib/ffmpeg/libavcodec/mpeg12dec.c +++ b/src/ExtLib/ffmpeg/libavcodec/mpeg12dec.c @@ -1308,8 +1308,6 @@ static int mpeg_field_start(Mpeg1Context *s1, const uint8_t *buf, int buf_size) s->cur_pic.linesize[i]); } s->cur_pic.linesize[i] *= 2; - s->last_pic.linesize[i] *= 2; - s->next_pic.linesize[i] *= 2; } } diff --git a/src/ExtLib/ffmpeg/libavcodec/pngdec.c b/src/ExtLib/ffmpeg/libavcodec/pngdec.c index 1c910e6a5b..180806e5e1 100644 --- a/src/ExtLib/ffmpeg/libavcodec/pngdec.c +++ b/src/ExtLib/ffmpeg/libavcodec/pngdec.c @@ -86,11 +86,12 @@ typedef struct PNGDecContext { int have_clli; uint32_t clli_max; uint32_t clli_avg; - int have_mdvc; - uint16_t mdvc_primaries[3][2]; - uint16_t mdvc_white_point[2]; - uint32_t mdvc_max_lum; - uint32_t mdvc_min_lum; + /* Mastering Display Color Volume */ + int have_mdcv; + uint16_t mdcv_primaries[3][2]; + uint16_t mdcv_white_point[2]; + uint32_t mdcv_max_lum; + uint32_t mdcv_min_lum; enum PNGHeaderState hdr_state; enum PNGImageState pic_state; @@ -763,24 +764,24 @@ static int populate_avctx_color_fields(AVCodecContext *avctx, AVFrame *frame) } } - if (s->have_mdvc) { - AVMasteringDisplayMetadata *mdvc; + if (s->have_mdcv) { + AVMasteringDisplayMetadata *mdcv; - ret = ff_decode_mastering_display_new(avctx, frame, &mdvc); + ret = ff_decode_mastering_display_new(avctx, frame, &mdcv); if (ret < 0) return ret; - if (mdvc) { - mdvc->has_primaries = 1; + if (mdcv) { + mdcv->has_primaries = 1; for (int i = 0; i < 3; i++) { - mdvc->display_primaries[i][0] = av_make_q(s->mdvc_primaries[i][0], 50000); - mdvc->display_primaries[i][1] = av_make_q(s->mdvc_primaries[i][1], 50000); + mdcv->display_primaries[i][0] = av_make_q(s->mdcv_primaries[i][0], 50000); + mdcv->display_primaries[i][1] = av_make_q(s->mdcv_primaries[i][1], 50000); } - mdvc->white_point[0] = av_make_q(s->mdvc_white_point[0], 50000); - mdvc->white_point[1] = av_make_q(s->mdvc_white_point[1], 50000); - mdvc->has_luminance = 1; - mdvc->max_luminance = av_make_q(s->mdvc_max_lum, 10000); - mdvc->min_luminance = av_make_q(s->mdvc_min_lum, 10000); + mdcv->white_point[0] = av_make_q(s->mdcv_white_point[0], 50000); + mdcv->white_point[1] = av_make_q(s->mdcv_white_point[1], 50000); + mdcv->has_luminance = 1; + mdcv->max_luminance = av_make_q(s->mdcv_max_lum, 10000); + mdcv->min_luminance = av_make_q(s->mdcv_min_lum, 10000); } } @@ -1571,20 +1572,20 @@ static int decode_frame_common(AVCodecContext *avctx, PNGDecContext *s, s->clli_max = bytestream2_get_be32u(&gb_chunk); s->clli_avg = bytestream2_get_be32u(&gb_chunk); break; - case MKTAG('m', 'D', 'V', 'c'): + case MKTAG('m', 'D', 'C', 'v'): if (bytestream2_get_bytes_left(&gb_chunk) != 24) { - av_log(avctx, AV_LOG_WARNING, "Invalid mDVc chunk size: %d\n", bytestream2_get_bytes_left(&gb_chunk)); + av_log(avctx, AV_LOG_WARNING, "Invalid mDCv chunk size: %d\n", bytestream2_get_bytes_left(&gb_chunk)); break; } - s->have_mdvc = 1; + s->have_mdcv = 1; for (int i = 0; i < 3; i++) { - s->mdvc_primaries[i][0] = bytestream2_get_be16u(&gb_chunk); - s->mdvc_primaries[i][1] = bytestream2_get_be16u(&gb_chunk); + s->mdcv_primaries[i][0] = bytestream2_get_be16u(&gb_chunk); + s->mdcv_primaries[i][1] = bytestream2_get_be16u(&gb_chunk); } - s->mdvc_white_point[0] = bytestream2_get_be16u(&gb_chunk); - s->mdvc_white_point[1] = bytestream2_get_be16u(&gb_chunk); - s->mdvc_max_lum = bytestream2_get_be32u(&gb_chunk); - s->mdvc_min_lum = bytestream2_get_be32u(&gb_chunk); + s->mdcv_white_point[0] = bytestream2_get_be16u(&gb_chunk); + s->mdcv_white_point[1] = bytestream2_get_be16u(&gb_chunk); + s->mdcv_max_lum = bytestream2_get_be32u(&gb_chunk); + s->mdcv_min_lum = bytestream2_get_be32u(&gb_chunk); break; case MKTAG('I', 'E', 'N', 'D'): if (!(s->pic_state & PNG_ALLIMAGE)) diff --git a/src/ExtLib/ffmpeg/libavcodec/vc1_loopfilter.c b/src/ExtLib/ffmpeg/libavcodec/vc1_loopfilter.c index 2053197dc1..409deb3ef1 100644 --- a/src/ExtLib/ffmpeg/libavcodec/vc1_loopfilter.c +++ b/src/ExtLib/ffmpeg/libavcodec/vc1_loopfilter.c @@ -1128,10 +1128,7 @@ void vc1_b_h_intfi_loop_filter(VC1Context *v, uint8_t *dest, const uint32_t *cbp dst = dest + (block_num & 2) * 4 * s->linesize + (block_num & 1) * 8; if (!(flags & RIGHT_EDGE) || !(block_num & 5)) { - if (block_num > 3) - v->vc1dsp.vc1_h_loop_filter8(dst + 8, linesize, pq); - else - v->vc1dsp.vc1_h_loop_filter8(dst + 8, linesize, pq); + v->vc1dsp.vc1_h_loop_filter8(dst + 8, linesize, pq); } tt = ttblk[0] >> (block_num * 4) & 0xf; diff --git a/src/ExtLib/ffmpeg/libavcodec/vvc/ctu.c b/src/ExtLib/ffmpeg/libavcodec/vvc/ctu.c index bd0be2d821..8dd6ea77cd 100644 --- a/src/ExtLib/ffmpeg/libavcodec/vvc/ctu.c +++ b/src/ExtLib/ffmpeg/libavcodec/vvc/ctu.c @@ -1878,8 +1878,6 @@ static int hls_coding_unit(VVCLocalContext *lc, int x0, int y0, int cb_width, in cu->lfnst_idx = lfnst_idx_decode(lc); cu->mts_idx = mts_idx_decode(lc); set_qp_c(lc); - if (ret < 0) - return ret; } else { ret = skipped_transform_tree_unit(lc); if (ret < 0) diff --git a/src/ExtLib/ffmpeg/libavcodec/vvc/dec.c b/src/ExtLib/ffmpeg/libavcodec/vvc/dec.c index c9f25696b4..3c00c141ad 100644 --- a/src/ExtLib/ffmpeg/libavcodec/vvc/dec.c +++ b/src/ExtLib/ffmpeg/libavcodec/vvc/dec.c @@ -476,13 +476,14 @@ static int slices_realloc(VVCFrameContext *fc) return 0; } -static void ep_init_cabac_decoder(SliceContext *sc, const int index, +static int ep_init_cabac_decoder(SliceContext *sc, const int index, const H2645NAL *nal, GetBitContext *gb, const CodedBitstreamUnit *unit) { const H266RawSlice *slice = unit->content_ref; const H266RawSliceHeader *rsh = sc->sh.r; EntryPoint *ep = sc->eps + index; int size; + int ret; if (index < rsh->num_entry_points) { int skipped = 0; @@ -501,8 +502,11 @@ static void ep_init_cabac_decoder(SliceContext *sc, const int index, size = get_bits_left(gb) / 8; } av_assert0(gb->buffer + get_bits_count(gb) / 8 + size <= gb->buffer_end); - ff_init_cabac_decoder (&ep->cc, gb->buffer + get_bits_count(gb) / 8, size); + ret = ff_init_cabac_decoder (&ep->cc, gb->buffer + get_bits_count(gb) / 8, size); + if (ret < 0) + return ret; skip_bits(gb, size * 8); + return 0; } static int slice_init_entry_points(SliceContext *sc, @@ -538,7 +542,9 @@ static int slice_init_entry_points(SliceContext *sc, fc->tab.slice_idx[rs] = sc->slice_idx; } - ep_init_cabac_decoder(sc, i, nal, &gb, unit); + ret = ep_init_cabac_decoder(sc, i, nal, &gb, unit); + if (ret < 0) + return ret; if (i + 1 < sc->nb_eps) ctu_addr = sh->entry_point_start_ctu[i]; @@ -835,7 +841,6 @@ static int decode_nal_units(VVCContext *s, VVCFrameContext *fc, AVPacket *avpkt) const CodedBitstreamH266Context *h266 = s->cbc->priv_data; CodedBitstreamFragment *frame = &s->current_frame; int ret = 0; - int eos_at_start = 1; s->last_eos = s->eos; s->eos = 0; @@ -851,10 +856,7 @@ static int decode_nal_units(VVCContext *s, VVCFrameContext *fc, AVPacket *avpkt) const CodedBitstreamUnit *unit = frame->units + i; if (unit->type == VVC_EOB_NUT || unit->type == VVC_EOS_NUT) { - if (eos_at_start) - s->last_eos = 1; - else - s->eos = 1; + s->last_eos = 1; } else { ret = decode_nal_unit(s, fc, nal, unit); if (ret < 0) { diff --git a/src/ExtLib/ffmpeg/libavfilter/allfilters.c b/src/ExtLib/ffmpeg/libavfilter/allfilters.c index c532682fc2..63600e9b58 100644 --- a/src/ExtLib/ffmpeg/libavfilter/allfilters.c +++ b/src/ExtLib/ffmpeg/libavfilter/allfilters.c @@ -569,6 +569,7 @@ extern const AVFilter ff_vsrc_openclsrc; extern const AVFilter ff_vsrc_qrencodesrc; extern const AVFilter ff_vsrc_pal75bars; extern const AVFilter ff_vsrc_pal100bars; +extern const AVFilter ff_vsrc_perlin; extern const AVFilter ff_vsrc_rgbtestsrc; extern const AVFilter ff_vsrc_sierpinski; extern const AVFilter ff_vsrc_smptebars; diff --git a/src/ExtLib/ffmpeg/libavutil/hwcontext_d3d12va.c b/src/ExtLib/ffmpeg/libavutil/hwcontext_d3d12va.c index f8db0d4813..ee5ac26417 100644 --- a/src/ExtLib/ffmpeg/libavutil/hwcontext_d3d12va.c +++ b/src/ExtLib/ffmpeg/libavutil/hwcontext_d3d12va.c @@ -247,7 +247,7 @@ static AVBufferRef *d3d12va_pool_alloc(void *opaque, size_t size) .Format = hwctx->format, .SampleDesc = {.Count = 1, .Quality = 0 }, .Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN, - .Flags = D3D12_RESOURCE_FLAG_NONE, + .Flags = hwctx->flags, }; frame = av_mallocz(sizeof(AVD3D12VAFrame)); diff --git a/src/ExtLib/ffmpeg/libavutil/hwcontext_d3d12va.h b/src/ExtLib/ffmpeg/libavutil/hwcontext_d3d12va.h index 5d27d28f42..38818f8525 100644 --- a/src/ExtLib/ffmpeg/libavutil/hwcontext_d3d12va.h +++ b/src/ExtLib/ffmpeg/libavutil/hwcontext_d3d12va.h @@ -137,6 +137,14 @@ typedef struct AVD3D12VAFramesContext { * If unset, will be automatically set. */ DXGI_FORMAT format; + + /** + * Options for working with resources. + * If unset, this will be D3D12_RESOURCE_FLAG_NONE. + * + * @see https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ne-d3d12-d3d12_resource_flags + */ + D3D12_RESOURCE_FLAGS flags; } AVD3D12VAFramesContext; // ==> Start patch MPC diff --git a/src/ExtLib/ffmpeg/libavutil/timestamp.c b/src/ExtLib/ffmpeg/libavutil/timestamp.c index 2a3e3012a4..6c231a517d 100644 --- a/src/ExtLib/ffmpeg/libavutil/timestamp.c +++ b/src/ExtLib/ffmpeg/libavutil/timestamp.c @@ -24,7 +24,7 @@ char *av_ts_make_time_string2(char *buf, int64_t ts, AVRational tb) snprintf(buf, AV_TS_MAX_STRING_SIZE, "NOPTS"); } else { double val = av_q2d(tb) * ts; - double log = floor(log10(fabs(val))); + double log = (fpclassify(val) == FP_ZERO ? -INFINITY : floor(log10(fabs(val)))); int precision = (isfinite(log) && log < 0) ? -log + 5 : 6; int last = snprintf(buf, AV_TS_MAX_STRING_SIZE, "%.*f", precision, val); last = FFMIN(last, AV_TS_MAX_STRING_SIZE - 1) - 1; diff --git a/src/ExtLib/ffmpeg/libavutil/version.h b/src/ExtLib/ffmpeg/libavutil/version.h index a8962734e7..814892a4d5 100644 --- a/src/ExtLib/ffmpeg/libavutil/version.h +++ b/src/ExtLib/ffmpeg/libavutil/version.h @@ -79,7 +79,7 @@ */ #define LIBAVUTIL_VERSION_MAJOR 59 -#define LIBAVUTIL_VERSION_MINOR 27 +#define LIBAVUTIL_VERSION_MINOR 28 #define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ diff --git a/src/ExtLib/ffmpeg/libswresample/swresample.h b/src/ExtLib/ffmpeg/libswresample/swresample.h index 822cb743de..2155e8fb94 100644 --- a/src/ExtLib/ffmpeg/libswresample/swresample.h +++ b/src/ExtLib/ffmpeg/libswresample/swresample.h @@ -49,8 +49,8 @@ * matrix). This is using the swr_alloc() function. * @code * SwrContext *swr = swr_alloc(); - * av_opt_set_channel_layout(swr, "in_channel_layout", AV_CH_LAYOUT_5POINT1, 0); - * av_opt_set_channel_layout(swr, "out_channel_layout", AV_CH_LAYOUT_STEREO, 0); + * av_opt_set_chlayout(swr, "in_chlayout", &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1, 0); + * av_opt_set_chlayout(swr, "out_chlayout", &(AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO, 0); * av_opt_set_int(swr, "in_sample_rate", 48000, 0); * av_opt_set_int(swr, "out_sample_rate", 44100, 0); * av_opt_set_sample_fmt(swr, "in_sample_fmt", AV_SAMPLE_FMT_FLTP, 0); diff --git a/src/ExtLib/ffmpeg/libswscale/x86/yuv2rgb.c b/src/ExtLib/ffmpeg/libswscale/x86/yuv2rgb.c index 6754062245..41dfa80f33 100644 --- a/src/ExtLib/ffmpeg/libswscale/x86/yuv2rgb.c +++ b/src/ExtLib/ffmpeg/libswscale/x86/yuv2rgb.c @@ -41,25 +41,8 @@ #define DITHER1XBPP // only for MMX -//MMX versions -#if HAVE_MMX -#undef RENAME -#define COMPILE_TEMPLATE_MMX -#define RENAME(a) a ## _mmx -#include "yuv2rgb_template.c" -#undef COMPILE_TEMPLATE_MMX -#endif /* HAVE_MMX */ - -// MMXEXT versions -#undef RENAME -#define COMPILE_TEMPLATE_MMXEXT -#define RENAME(a) a ## _mmxext -#include "yuv2rgb_template.c" -#undef COMPILE_TEMPLATE_MMXEXT - //SSSE3 versions #undef RENAME -#define COMPILE_TEMPLATE_SSSE3 #define RENAME(a) a ## _ssse3 #include "yuv2rgb_template.c" @@ -99,40 +82,6 @@ av_cold SwsFunc ff_yuv2rgb_init_x86(SwsContext *c) } } - if (EXTERNAL_MMXEXT(cpu_flags)) { - switch (c->dstFormat) { - case AV_PIX_FMT_RGB24: - return yuv420_rgb24_mmxext; - case AV_PIX_FMT_BGR24: - return yuv420_bgr24_mmxext; - } - } - - if (EXTERNAL_MMX(cpu_flags)) { - switch (c->dstFormat) { - case AV_PIX_FMT_RGB32: - if (c->srcFormat == AV_PIX_FMT_YUVA420P) { -#if CONFIG_SWSCALE_ALPHA - return yuva420_rgb32_mmx; -#endif - break; - } else - return yuv420_rgb32_mmx; - case AV_PIX_FMT_BGR32: - if (c->srcFormat == AV_PIX_FMT_YUVA420P) { -#if CONFIG_SWSCALE_ALPHA - return yuva420_bgr32_mmx; -#endif - break; - } else - return yuv420_bgr32_mmx; - case AV_PIX_FMT_RGB565: - return yuv420_rgb16_mmx; - case AV_PIX_FMT_RGB555: - return yuv420_rgb15_mmx; - } - } - #endif /* HAVE_X86ASM */ return NULL; } diff --git a/src/ExtLib/ffmpeg/libswscale/x86/yuv2rgb_template.c b/src/ExtLib/ffmpeg/libswscale/x86/yuv2rgb_template.c index 596943bb73..a4741e6873 100644 --- a/src/ExtLib/ffmpeg/libswscale/x86/yuv2rgb_template.c +++ b/src/ExtLib/ffmpeg/libswscale/x86/yuv2rgb_template.c @@ -47,7 +47,6 @@ extern void RENAME(ff_yuv_420_bgr24)(x86_reg index, uint8_t *image, const uint8_ const uint8_t *pv_index, const uint64_t *pointer_c_dither, const uint8_t *py_2index); -#ifndef COMPILE_TEMPLATE_MMXEXT extern void RENAME(ff_yuv_420_rgb15)(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); @@ -163,9 +162,7 @@ static inline int RENAME(yuva420_bgr32)(SwsContext *c, const uint8_t *src[], } return srcSliceH; } -#endif -#if !defined(COMPILE_TEMPLATE_MMX) static inline int RENAME(yuv420_rgb24)(SwsContext *c, const uint8_t *src[], int srcStride[], int srcSliceY, int srcSliceH, @@ -193,4 +190,3 @@ static inline int RENAME(yuv420_bgr24)(SwsContext *c, const uint8_t *src[], } return srcSliceH; } -#endif diff --git a/src/ExtLib/ffmpeg/libswscale/x86/yuv_2_rgb.asm b/src/ExtLib/ffmpeg/libswscale/x86/yuv_2_rgb.asm index a1f9134e08..b67ab162d2 100644 --- a/src/ExtLib/ffmpeg/libswscale/x86/yuv_2_rgb.asm +++ b/src/ExtLib/ffmpeg/libswscale/x86/yuv_2_rgb.asm @@ -38,12 +38,6 @@ pb_e0: times 16 db 224 pb_03: times 16 db 3 pb_07: times 16 db 7 -mask_1101: dw -1, -1, 0, -1 -mask_0010: dw 0, 0, -1, 0 -mask_0110: dw 0, -1, -1, 0 -mask_1001: dw -1, 0, 0, -1 -mask_0100: dw 0, -1, 0, 0 - SECTION .text ;----------------------------------------------------------------------------- @@ -55,14 +49,6 @@ SECTION .text ; ;----------------------------------------------------------------------------- -%macro MOV_H2L 1 -%if mmsize == 8 - psrlq %1, 32 -%else ; mmsize == 16 - psrldq %1, 8 -%endif -%endmacro - %macro yuv2rgb_fn 3 %if %3 == 32 @@ -91,18 +77,6 @@ SECTION .text %define m_blue m1 %endif -%if mmsize == 8 -%define time_num 1 -%define reg_num 8 -%define y_offset [pointer_c_ditherq + 8 * 8] -%define u_offset [pointer_c_ditherq + 9 * 8] -%define v_offset [pointer_c_ditherq + 10 * 8] -%define ug_coff [pointer_c_ditherq + 7 * 8] -%define vg_coff [pointer_c_ditherq + 6 * 8] -%define y_coff [pointer_c_ditherq + 3 * 8] -%define ub_coff [pointer_c_ditherq + 5 * 8] -%define vr_coff [pointer_c_ditherq + 4 * 8] -%elif mmsize == 16 %define time_num 2 %if ARCH_X86_32 %define reg_num 8 @@ -125,13 +99,11 @@ SECTION .text %define ub_coff m14 %define vr_coff m15 %endif ; ARCH_X86_32/64 -%endif ; coeff define mmsize == 8/16 cglobal %1_420_%2%3, GPR_num, GPR_num, reg_num, parameters %if ARCH_X86_64 movsxd indexq, indexd -%if mmsize == 16 VBROADCASTSD y_offset, [pointer_c_ditherq + 8 * 8] VBROADCASTSD u_offset, [pointer_c_ditherq + 9 * 8] VBROADCASTSD v_offset, [pointer_c_ditherq + 10 * 8] @@ -141,7 +113,6 @@ cglobal %1_420_%2%3, GPR_num, GPR_num, reg_num, parameters VBROADCASTSD ub_coff, [pointer_c_ditherq + 5 * 8] VBROADCASTSD vr_coff, [pointer_c_ditherq + 4 * 8] %endif -%endif .loop0: movu m_y, [py_2indexq + 2 * indexq] movh m_u, [pu_indexq + indexq] @@ -157,7 +128,7 @@ cglobal %1_420_%2%3, GPR_num, GPR_num, reg_num, parameters psllw m1, 3 psllw m6, 3 psllw m7, 3 -%if (ARCH_X86_32 && mmsize == 16) +%if ARCH_X86_32 VBROADCASTSD m2, mu_offset VBROADCASTSD m3, mv_offset VBROADCASTSD m4, my_offset @@ -176,7 +147,7 @@ cglobal %1_420_%2%3, GPR_num, GPR_num, reg_num, parameters pmulhw m0, m5 VBROADCASTSD m4, mvr_coff pmulhw m1, m4 -%else ; ARCH_X86_64 || mmsize == 8 +%else ; ARCH_X86_64 psubsw m0, u_offset ; U = U - 128 psubsw m1, v_offset ; V = V - 128 psubw m6, y_offset @@ -207,49 +178,10 @@ cglobal %1_420_%2%3, GPR_num, GPR_num, reg_num, parameters packuswb m2, m7 ; G0 G2 G4 G6 ... G1 G3 G5 G7 ... mova m3, m_red mova m6, m_blue - MOV_H2L m_red + psrldq m_red, 8 punpcklbw m3, m2 ; R0 G0 R2 G2 R4 G4 R6 G6 R8 G8 ... punpcklbw m6, m_red ; B0 R1 B2 R3 B4 R5 B6 R7 B8 R9 ... - mova m5, m3 punpckhbw m2, m_blue ; G1 B1 G3 B3 G5 B5 G7 B7 G9 B9 ... -%if mmsize == 8 - punpcklwd m3 ,m6 ; R0 G0 B0 R1 R2 G2 B2 R3 - punpckhwd m5, m6 ; R4 G4 B4 R5 R6 G6 B6 R7 -%if cpuflag(mmxext) - pshufw m1, m2, 0xc6 - pshufw m6, m3, 0x84 - pshufw m7, m5, 0x38 - pand m6, [mask_1101] ; R0 G0 B0 R1 -- -- R2 G2 - movq m0, m1 - pand m7, [mask_0110] ; -- -- R6 G6 B6 R7 -- -- - movq m2, m1 - pand m1, [mask_0100] ; -- -- G3 B3 -- -- -- -- - psrlq m3, 48 ; B2 R3 -- -- -- -- -- -- - pand m0, [mask_0010] ; -- -- -- -- G1 B1 -- -- - psllq m5, 32 ; -- -- -- -- R4 G4 B4 R5 - pand m2, [mask_1001] ; G5 B5 -- -- -- -- G7 B7 - por m1, m3 - por m0, m6 - por m1, m5 - por m2, m7 - movntq [imageq], m0 - movntq [imageq + 8], m1 - movntq [imageq + 16], m2 -%else ; cpuflag(mmx) - movd [imageq], m3 ; R0 G0 R2 G2 - movd [imageq + 4], m2 ; G1 B1 - psrlq m3, 32 - psrlq m2, 16 - movd [imageq + 6], m3 ; R2 G2 B2 R3 - movd [imageq + 10], m2 ; G3 B3 - psrlq m2, 16 - movd [imageq + 12], m5 ; R4 G4 B4 R5 - movd [imageq + 16], m2 ; G5 B5 - psrlq m5, 32 - movd [imageq + 20], m2 ; -- -- G7 B7 - movd [imageq + 18], m5 ; R6 G6 B6 R7 -%endif ; cpuflag -%else ; mmsize == 16 pshufb m3, [rgb24_shuf1] ; r0 g0 r6 g6 r12 g12 r2 g2 r8 g8 r14 g14 r4 g4 r10 g10 pshufb m6, [rgb24_shuf2] ; b10 r11 b0 r1 b6 r7 b12 r13 b2 r3 b8 r9 b14 r15 b4 r5 pshufb m2, [rgb24_shuf3] ; g5 b5 g11 b11 g1 b1 g7 b7 g13 b13 g3 b3 g9 b9 g15 b15 @@ -274,7 +206,6 @@ cglobal %1_420_%2%3, GPR_num, GPR_num, reg_num, parameters movu [imageq], m0 movu [imageq + 16], m1 movu [imageq + 32], m2 -%endif ; mmsize = 16 %else ; PACK RGB15/16/32 packuswb m0, m1 packuswb m3, m5 @@ -309,18 +240,12 @@ cglobal %1_420_%2%3, GPR_num, GPR_num, reg_num, parameters movu [imageq + 24 * time_num], m_alpha %else ; PACK RGB15/16 %define depth 2 -%if cpuflag(ssse3) %define red_dither m3 %define green_dither m4 %define blue_dither m5 VBROADCASTSD red_dither, [pointer_c_ditherq + 0 * 8] VBROADCASTSD green_dither, [pointer_c_ditherq + 1 * 8] VBROADCASTSD blue_dither, [pointer_c_ditherq + 2 * 8] -%else ; cpuflag(mmx/mmxext) -%define blue_dither [pointer_c_ditherq + 2 * 8] -%define green_dither [pointer_c_ditherq + 1 * 8] -%define red_dither [pointer_c_ditherq + 0 * 8] -%endif %if %3 == 15 %define gmask pb_03 %define isRGB15 1 @@ -358,18 +283,6 @@ RET %endmacro -INIT_MMX mmx -yuv2rgb_fn yuv, rgb, 32 -yuv2rgb_fn yuv, bgr, 32 -yuv2rgb_fn yuva, rgb, 32 -yuv2rgb_fn yuva, bgr, 32 -yuv2rgb_fn yuv, rgb, 15 -yuv2rgb_fn yuv, rgb, 16 - -INIT_MMX mmxext -yuv2rgb_fn yuv, rgb, 24 -yuv2rgb_fn yuv, bgr, 24 - INIT_XMM ssse3 yuv2rgb_fn yuv, rgb, 24 yuv2rgb_fn yuv, bgr, 24