From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 3CC2343778 for ; Tue, 28 Jun 2022 05:26:02 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 14A7E68B915; Tue, 28 Jun 2022 08:26:00 +0300 (EEST) Received: from NAM12-DM6-obe.outbound.protection.outlook.com (mail-dm6nam12olkn2105.outbound.protection.outlook.com [40.92.22.105]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8DBC668B69B for ; Tue, 28 Jun 2022 08:25:52 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=MyK76+VDw5CvfMs3MOIp5diBoZlsjz3sVsB6ynGxZnsi60S0E6/l0BsuP7o8Rmxyb9br4Sl8WpAvlF+cTpLBEYt1zqj/ThSSgqD6HSQ2Y1W2tOywFfNH7+PuTgmoj5gAQ1vFUBrcSKVyvO4VZzZPJfXv8vbJz9YjEhvW/BGENTd8e8msUaxbv0gE3yhw2X39c7kKwWYwoSWi23NN7oUe8b7NjgbPXGDiUdBszJc/rJ8rodFIPZA5nUm3ViM02OFEG7mzey/ygozd+o0pBwb6quSahxEOwFAg+iJwzut/fgDViPCwexwl4ISNCphb9bpYhsh6NKN5bZXEY6ejZ97NUQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=lQ23orCMUAHXX/UwvxiH3N4R+Mf69PjCmIXcN3E6MXY=; b=Sj+K85fmIK8lYOiCXrpOT5C/11OYZ7eniHPFWx+OAqMSLWFs8eOkvLhfNs8UVGnFDTP0yfv9/nxiYMcTS9on+HViOpw+UDNU4l4rPQzYsAj0q4UDS5oqoxxu5E2eKkCmIDJrfjoYwLDubcsMgzKiTf0sENoejmM+Gz8m9Wu/P/tJMNtD8kntqcbEncD2YuB7TkH02BcGCfS9/XagqW5jP2gXCzFHq1BuSxBd6MD5ALgIcaPiEuyYRrChcuPUp/J+j8Dc19cKGFMhgVCJjtqCMDlJ++bYs9mmUYEU9lE11DUMng8BMzjiO7CrRj0mJGOq/PZNKXbd0KlVvDHOCr+dig== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hotmail.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=lQ23orCMUAHXX/UwvxiH3N4R+Mf69PjCmIXcN3E6MXY=; b=EwuM3Q99QC60XczQ+fF6i51LLlhTRqBi48B+M57IB+zIxikagoef4oAcZ70N/7J3OnpoHbLY30IsQqs9tuU9Y0iTPrc/ZyhE3NtD1VDlYm2e5DdfASYND2KPMJsSI/37gubdnuT2DM/RTW8Niwkb05l8gC/Cy0a4FjpZ6biFCBawLWMxTvOoGWzwMUWw84cQDTQqNm6SJS0WuuX6dqqMkPQBEmO7+5yc8EBDRY0AcNzXoXMWmPcvypYViL9kDBVu3Ij5/+WjQRg+7CIz9GOAYSXukHHII/3JHJHjK6bKwiDVDQoryXoKztyMremaPf9Ud9pxiBUhxEtm3l7Hn//KIA== Received: from DM8P223MB0365.NAMP223.PROD.OUTLOOK.COM (2603:10b6:8:b::20) by DM8P223MB0159.NAMP223.PROD.OUTLOOK.COM (2603:10b6:8:5::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5373.15; Tue, 28 Jun 2022 05:25:50 +0000 Received: from DM8P223MB0365.NAMP223.PROD.OUTLOOK.COM ([fe80::d9e4:ced6:ab31:c231]) by DM8P223MB0365.NAMP223.PROD.OUTLOOK.COM ([fe80::d9e4:ced6:ab31:c231%2]) with mapi id 15.20.5373.018; Tue, 28 Jun 2022 05:25:49 +0000 From: Soft Works To: FFmpeg development discussions and patches Thread-Topic: [FFmpeg-devel] [PATCH v4 6/6] avcodec/qsvdec: Implement SEI parsing for QSV decoders Thread-Index: AQHYibZGuLaBHI8dUk+lqBnv4vyQp61kOFgAgAANpZA= Date: Tue, 28 Jun 2022 05:25:49 +0000 Message-ID: References: <3f2588563e96ce105fddde849e86acf7cb3e2dbf.1656286888.git.ffmpegagent@gmail.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-tmn: [2F1811zL4pjKcS2sGn88sr5vUHr9Wdjr] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: eb555618-ad83-476a-c620-08da58c6a9aa x-ms-traffictypediagnostic: DM8P223MB0159:EE_ x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: 7+sOetxMQf694SmUxdTw8RXtz4fAxS0/cy0qW5k6/1KYMMDImx7PpSrF5Mr8F0Js0IuPZ7o9FC5DnTnGRwAx7LfjFEbw1nUPmlex8C98WvkkZ77ovxzChtbaS/+4AIt/MaVfRlAhG8C3xWqP5ozCTP/zBy2l7yda0fHy48mCVhHOH+x9FYRGB3/uqFQwSiotPubCCDmFbvM1mC9jFTvJ/hBEEWSvcAjZlrpyV85IHNeTVQRYuR4zKxXQZRQr8uIXgbTnzKkOuvNbQliTHBm7h8XwgiZaAChQZXql8+A6WnArXXgzAPBc7XFTjO1osbIfH3JWI3L5gs0FnZLmA7okX5kw1Rg+m4JVZ6futlFOrdXzLkVzxEhJMYN5vhkVdxTcwozrzf1X45ScCAeYYZc+RqwZe6ZwObC0zpil2YRVZfxWJ97JbXMxI2LBs43MRUEwnlpXQ3pmD1ytwgq/KOwerhorkkZqfy1XQxd8jSBTk+/NGtOIbxOMZMvF3Ci7Zea4+wqPY/4GH1rpG2BEF+ozod/bM0MdTdLbQTek8gPvsUJfBQ8FPLHnnQbzu2VugqtOYvvGGkEOvC5OgghUsIyz5Y2h5pNoOLFTvKZePAsLb8IQE94x0z4bhMGHIBr+TJ3y x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?MWJNenRhRGFMUjRDRXhxNlI0SHlKaEJTTmRsclVrMmdSKzFRR1NnMEZlejNN?= =?utf-8?B?WlhkZWdPME81Q2ttc2UwRG5jR0ZpcCtReW9KRVV3RUFpOUNURnBGL3RWdjl3?= =?utf-8?B?SURYVElSazBZUmtSNjRNTmVPa0tvNDEwV1dTVExPbjN1clpVSXZkeWd2bVpk?= =?utf-8?B?TDJ4WjY1NU9qU2ZjRUtIbWlDTU42enBWNUNTSTVtdzFuSUM5WnhNaTBZd2Mx?= =?utf-8?B?bVhsSEpYdWk3STJmSnhNU1MwZzByN2JIYndiSnJhbmpVdDZFVDJUMWsxQmRD?= =?utf-8?B?LzVrYUU4UktDUEZGVyszd1RiSGtWSTRNcHdDVkVzeUdqWEcvNkcyN21vbnUv?= =?utf-8?B?U0diWmkvMnJFNHc0MDFtNTA4R0cvU1pRRDZTQ2Fvd3M5UTBKdG0rdm5lelo5?= =?utf-8?B?V01WSUVmclRGcjY4ODBtR2w4V2lSWDZ2WEpLRFpkb05HWmwxaXlkMjBpdE9q?= =?utf-8?B?YWpUVXl5NHd0Tk9oY0RLd3E0Ny9STm4xS2pOTDVZUUxzam1DdUdyVTZkcmpy?= =?utf-8?B?TVc1YUJtTWtKSmVhbmE1REJRRzZDNEhsNzdkeXF0eVJyMGFmSWJGM3ZUelN3?= =?utf-8?B?SjM4Ti93Y1lhQXYzV0xiVEdaYzBwYkt1eDA1WW9hNi9PeFJvOWhEYnNOd1du?= =?utf-8?B?cFBLKzVEOGZuNDYxeW9GZFJvNDFuYmVNUmQwRk1RVzAyZEhNSXJoajhDYkly?= =?utf-8?B?eFRqZ3FBNFowTHpxbDFOU2tReHU5YTh6VlpMQktCaVJ2OWVGdTN2bDZWZnFq?= =?utf-8?B?bHlDamplWVM3eGIxNHVmOVlFRmcrUXFjMDQyRy8vTU0wcStpY3RGVmJSYlRo?= =?utf-8?B?M1pRaUlFa29OQWVvTTdKN0c4akFCeG96SWFYdEdvUHBHbjd0TnhCUEVRTFRN?= =?utf-8?B?UmNwaFVyMndsdzN2UXNhS2k1bTFNUVpGejNTbDRjQmVnOHBSUk5Rdkd4RWEz?= =?utf-8?B?LzUxRmY1bytBc0FPVzlyM3hnNVk2ai9uVW5VVjc2Z1hubTFkZ0oxVTJaQ2h2?= =?utf-8?B?TFNpME1vRjROSGp4TElyRHhXeFNYaGp6SE51NXRLQUFhajBCTTFVVHRITUZW?= =?utf-8?B?TGNkWWNSaTE5MGFjZU04TXpJaS8xTVZzQTlMUlFDSGQzcDNaTm8vTi9tS2wx?= =?utf-8?B?SmRIYkZhVEVkVUlsclZyUjNDVS9EQmNhWWwvWFovMk1VbFdkL3NhaG5IWmVo?= =?utf-8?B?bzJ0OXlOcVltNkZMZEdMRTQwOVF0ZW0xaUdvcEduTEtmWWNTSWt4OXVNMFpO?= =?utf-8?B?Q2ZKNWwrUUs5Q2U2WDRtdHJ6N1JSczFWRmE0RmRST1JycnIyWDRNazR0L1hq?= =?utf-8?B?eUtGY2FEUHJmYUdyVU91MU9uMzVtUVh0Z3J6bzY2QnF3S2loWW44MVAvUjFM?= =?utf-8?B?QXlsN0xyY3RUd2EvLzlSVVNkU1N1WkFJdjFLUWhDcDVWRVhMTnE2d3QwTlVz?= =?utf-8?B?ME5Xa2c2NEVtRkxrU1lKT0hiVEtHd29IbWxqN3pTWWQ3bHdkanJPbkVSY3Y2?= =?utf-8?B?NHdrTElRalA4aXhob0FQRnkrZEdyUytDT0V6WTBFNHVlZDA4VjFiMCtrQWho?= =?utf-8?B?WUhwUmIyREZ5OUlSSGtvVWNKUWVBdFEyRFlCQUJyTS9LMXZFc05UeWpvSnda?= =?utf-8?B?S2c4N0NNUFF3Q3RrajRDZXZpdWFJOEgyaEEwTXVvdXBwNXBFSVlGYkg1Z2lP?= =?utf-8?B?L1padWxpY3pyaDJuRWRWZ1pid0huMVhiSlBCd3lxei9VQWpBUjhtZmRnPT0=?= MIME-Version: 1.0 X-OriginatorOrg: sct-15-20-4755-11-msonline-outlook-1ff67.templateTenant X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: DM8P223MB0365.NAMP223.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-CrossTenant-Network-Message-Id: eb555618-ad83-476a-c620-08da58c6a9aa X-MS-Exchange-CrossTenant-originalarrivaltime: 28 Jun 2022 05:25:49.9500 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-rms-persistedconsumerorg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM8P223MB0159 Subject: Re: [FFmpeg-devel] [PATCH v4 6/6] avcodec/qsvdec: Implement SEI parsing for QSV decoders X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: > -----Original Message----- > From: ffmpeg-devel On Behalf Of > Andreas Rheinhardt > Sent: Tuesday, June 28, 2022 6:17 AM > To: ffmpeg-devel@ffmpeg.org > Subject: Re: [FFmpeg-devel] [PATCH v4 6/6] avcodec/qsvdec: Implement > SEI parsing for QSV decoders > > softworkz: > > From: softworkz > > > > Signed-off-by: softworkz > > --- > > libavcodec/qsvdec.c | 234 > ++++++++++++++++++++++++++++++++++++++++++++ > > 1 file changed, 234 insertions(+) > > > > diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c > > index 5fc5bed4c8..e854f363ec 100644 > > --- a/libavcodec/qsvdec.c > > +++ b/libavcodec/qsvdec.c > > @@ -49,6 +49,12 @@ > > #include "hwconfig.h" > > #include "qsv.h" > > #include "qsv_internal.h" > > +#include "h264dec.h" > > +#include "h264_sei.h" > > +#include "hevcdec.h" > > +#include "hevc_ps.h" > > +#include "hevc_sei.h" > > +#include "mpeg12.h" > > > > static const AVRational mfx_tb = { 1, 90000 }; > > > > @@ -60,6 +66,8 @@ static const AVRational mfx_tb = { 1, 90000 }; > > AV_NOPTS_VALUE : pts_tb.num ? \ > > av_rescale_q(mfx_pts, mfx_tb, pts_tb) : mfx_pts) > > > > +#define PAYLOAD_BUFFER_SIZE 65535 > > + > > typedef struct QSVAsyncFrame { > > mfxSyncPoint *sync; > > QSVFrame *frame; > > @@ -101,6 +109,9 @@ typedef struct QSVContext { > > > > mfxExtBuffer **ext_buffers; > > int nb_ext_buffers; > > + > > + mfxU8 payload_buffer[PAYLOAD_BUFFER_SIZE]; > > + Mpeg1Context mpeg_ctx; > > } QSVContext; > > > > static const AVCodecHWConfigInternal *const qsv_hw_configs[] = { > > @@ -599,6 +610,210 @@ static int > qsv_export_film_grain(AVCodecContext *avctx, mfxExtAV1FilmGrainParam > > return 0; > > } > > #endif > > +static int find_start_offset(mfxU8 data[4]) > > +{ > > + if (data[0] == 0 && data[1] == 0 && data[2] == 1) > > + return 3; > > + > > + if (data[0] == 0 && data[1] == 0 && data[2] == 0 && data[3] == > 1) > > + return 4; > > + > > + return 0; > > +} > > + > > +static int parse_sei_h264(AVCodecContext* avctx, QSVContext* q, > AVFrame* out) > > +{ > > + H264SEIContext sei = { 0 }; > > + GetBitContext gb = { 0 }; > > + mfxPayload payload = { 0, .Data = &q->payload_buffer[0], > .BufSize = sizeof(q->payload_buffer) }; > > + mfxU64 ts; > > + int ret; > > + > > + while (1) { > > + int start; > > + memset(payload.Data, 0, payload.BufSize); > > + > > + ret = MFXVideoDECODE_GetPayload(q->session, &ts, > &payload); > > + if (ret == MFX_ERR_NOT_ENOUGH_BUFFER) { > > + av_log(avctx, AV_LOG_WARNING, "Warning: Insufficient > buffer on GetPayload(). Size: %"PRIu64" Needed: %d\n", sizeof(q- > >payload_buffer), payload.BufSize); > > + return 0; > > + } > > + if (ret != MFX_ERR_NONE) > > + return ret; > > + > > + if (payload.NumBit == 0 || payload.NumBit >= > payload.BufSize * 8) > > + break; > > + > > + start = find_start_offset(payload.Data); > > + > > + switch (payload.Type) { > > + case SEI_TYPE_BUFFERING_PERIOD: > > + case SEI_TYPE_PIC_TIMING: > > + continue; > > + } > > + > > + if (init_get_bits(&gb, &payload.Data[start], > payload.NumBit - start * 8) < 0) > > + av_log(avctx, AV_LOG_ERROR, "Error initializing > bitstream reader SEI type: %d Numbits %d error: %d\n", payload.Type, > payload.NumBit, ret); > > + else { > > + ret = ff_h264_sei_decode(&sei, &gb, NULL, avctx); > > + > > + if (ret < 0) > > + av_log(avctx, AV_LOG_WARNING, "Failed to parse SEI > type: %d Numbits %d error: %d\n", payload.Type, payload.NumBit, > ret); > > + else > > + av_log(avctx, AV_LOG_DEBUG, "mfxPayload Type: %d > Numbits %d\n", payload.Type, payload.NumBit); > > + } > > + } > > + > > + if (out) > > + return ff_h264_export_frame_props(avctx, &sei, NULL, out); > > + > > + return 0; > > +} > > + > > +static int parse_sei_hevc(AVCodecContext* avctx, QSVContext* q, > QSVFrame* out) > > +{ > > + HEVCSEI sei = { 0 }; > > + HEVCParamSets ps = { 0 }; > > + GetBitContext gb = { 0 }; > > + mfxPayload payload = { 0, .Data = &q->payload_buffer[0], > .BufSize = sizeof(q->payload_buffer) }; > > + mfxFrameSurface1 *surface = &out->surface; > > + mfxU64 ts; > > + int ret, has_logged = 0; > > + > > + while (1) { > > + int start; > > + memset(payload.Data, 0, payload.BufSize); > > + > > + ret = MFXVideoDECODE_GetPayload(q->session, &ts, > &payload); > > + if (ret == MFX_ERR_NOT_ENOUGH_BUFFER) { > > + av_log(avctx, AV_LOG_WARNING, "Warning: Insufficient > buffer on GetPayload(). Size: %"PRIu64" Needed: %d\n", sizeof(q- > >payload_buffer), payload.BufSize); > > + return 0; > > + } > > + if (ret != MFX_ERR_NONE) > > + return ret; > > + > > + if (payload.NumBit == 0 || payload.NumBit >= > payload.BufSize * 8) > > + break; > > + > > + if (!has_logged) { > > + has_logged = 1; > > + av_log(avctx, AV_LOG_VERBOSE, "----------------------- > ------------------\n"); > > + av_log(avctx, AV_LOG_VERBOSE, "Start reading SEI - > payload timestamp: %llu - surface timestamp: %llu\n", ts, surface- > >Data.TimeStamp); > > + } > > + > > + if (ts != surface->Data.TimeStamp) { > > + av_log(avctx, AV_LOG_WARNING, "GetPayload timestamp > (%llu) does not match surface timestamp: (%llu)\n", ts, surface- > >Data.TimeStamp); > > + } > > + > > + start = find_start_offset(payload.Data); > > + > > + av_log(avctx, AV_LOG_VERBOSE, "parsing SEI type: %3d > Numbits %3d Start: %d\n", payload.Type, payload.NumBit, start); > > + > > + switch (payload.Type) { > > + case SEI_TYPE_BUFFERING_PERIOD: > > + case SEI_TYPE_PIC_TIMING: > > + continue; > > + case SEI_TYPE_MASTERING_DISPLAY_COLOUR_VOLUME: > > + // There seems to be a bug in MSDK > > + payload.NumBit -= 8; > > + > > + break; > > + case SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO: > > + // There seems to be a bug in MSDK > > + payload.NumBit = 48; > > + > > + break; > > + case SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35: > > + // There seems to be a bug in MSDK > > + if (payload.NumBit == 552) > > + payload.NumBit = 528; > > + break; > > + } > > + > > + if (init_get_bits(&gb, &payload.Data[start], > payload.NumBit - start * 8) < 0) > > + av_log(avctx, AV_LOG_ERROR, "Error initializing > bitstream reader SEI type: %d Numbits %d error: %d\n", payload.Type, > payload.NumBit, ret); > > + else { > > + ret = ff_hevc_decode_nal_sei(&gb, avctx, &sei, &ps, > HEVC_NAL_SEI_PREFIX); > > + > > + if (ret < 0) > > + av_log(avctx, AV_LOG_WARNING, "Failed to parse SEI > type: %d Numbits %d error: %d\n", payload.Type, payload.NumBit, > ret); > > + else > > + av_log(avctx, AV_LOG_DEBUG, "mfxPayload Type: %d > Numbits %d\n", payload.Type, payload.NumBit); > > + } > > + } > > + > > + if (has_logged) { > > + av_log(avctx, AV_LOG_VERBOSE, "End reading SEI\n"); > > + } > > + > > + if (out && out->frame) > > + return ff_hevc_set_side_data(avctx, &sei, NULL, out- > >frame); > > + > > + return 0; > > +} > > + > > +static int parse_sei_mpeg12(AVCodecContext* avctx, QSVContext* q, > AVFrame* out) > > +{ > > + Mpeg1Context *mpeg_ctx = &q->mpeg_ctx; > > + mfxPayload payload = { 0, .Data = &q->payload_buffer[0], > .BufSize = sizeof(q->payload_buffer) }; > > + mfxU64 ts; > > + int ret; > > + > > + while (1) { > > + int start; > > + > > + memset(payload.Data, 0, payload.BufSize); > > + ret = MFXVideoDECODE_GetPayload(q->session, &ts, > &payload); > > + if (ret == MFX_ERR_NOT_ENOUGH_BUFFER) { > > + av_log(avctx, AV_LOG_WARNING, "Warning: Insufficient > buffer on GetPayload(). Size: %"PRIu64" Needed: %d\n", sizeof(q- > >payload_buffer), payload.BufSize); > > + return 0; > > + } > > + if (ret != MFX_ERR_NONE) > > + return ret; > > + > > + if (payload.NumBit == 0 || payload.NumBit >= > payload.BufSize * 8) > > + break; > > + > > + start = find_start_offset(payload.Data); > > + > > + start++; > > + > > + ff_mpeg_decode_user_data(avctx, mpeg_ctx, > &payload.Data[start], (int)((payload.NumBit + 7) / 8) - start); > > + > > + av_log(avctx, AV_LOG_DEBUG, "mfxPayload Type: %d Numbits > %d start %d -> %.s\n", payload.Type, payload.NumBit, start, (char > *)(&payload.Data[start])); > > + } > > + > > + if (!out) > > + return 0; > > + > > + if (mpeg_ctx->a53_buf_ref) { > > + > > + AVFrameSideData *sd = av_frame_new_side_data_from_buf(out, > AV_FRAME_DATA_A53_CC, mpeg_ctx->a53_buf_ref); > > + if (!sd) > > + av_buffer_unref(&mpeg_ctx->a53_buf_ref); > > + mpeg_ctx->a53_buf_ref = NULL; > > + } > > + > > + if (mpeg_ctx->has_stereo3d) { > > + AVStereo3D *stereo = av_stereo3d_create_side_data(out); > > + if (!stereo) > > + return AVERROR(ENOMEM); > > + > > + *stereo = mpeg_ctx->stereo3d; > > + mpeg_ctx->has_stereo3d = 0; > > + } > > + > > + if (mpeg_ctx->has_afd) { > > + AVFrameSideData *sd = av_frame_new_side_data(out, > AV_FRAME_DATA_AFD, 1); > > + if (!sd) > > + return AVERROR(ENOMEM); > > + > > + *sd->data = mpeg_ctx->afd; > > + mpeg_ctx->has_afd = 0; > > + } > > + > > + return 0; > > +} > > > > static int qsv_decode(AVCodecContext *avctx, QSVContext *q, > > AVFrame *frame, int *got_frame, > > @@ -636,6 +851,8 @@ static int qsv_decode(AVCodecContext *avctx, > QSVContext *q, > > insurf, &outsurf, > sync); > > if (ret == MFX_WRN_DEVICE_BUSY) > > av_usleep(500); > > + else if (avctx->codec_id == AV_CODEC_ID_MPEG2VIDEO) > > + parse_sei_mpeg12(avctx, q, NULL); > > > > } while (ret == MFX_WRN_DEVICE_BUSY || ret == > MFX_ERR_MORE_SURFACE); > > > > @@ -677,6 +894,23 @@ static int qsv_decode(AVCodecContext *avctx, > QSVContext *q, > > return AVERROR_BUG; > > } > > > > + switch (avctx->codec_id) { > > + case AV_CODEC_ID_MPEG2VIDEO: > > + ret = parse_sei_mpeg12(avctx, q, out_frame->frame); > > + break; > > + case AV_CODEC_ID_H264: > > + ret = parse_sei_h264(avctx, q, out_frame->frame); > > + break; > > + case AV_CODEC_ID_HEVC: > > + ret = parse_sei_hevc(avctx, q, out_frame); > > + break; > > + default: > > + ret = 0; > > + } > > + > > + if (ret < 0) > > + av_log(avctx, AV_LOG_ERROR, "Error parsing SEI data: > %d\n", ret); > > + > > out_frame->queued += 1; > > > > aframe = (QSVAsyncFrame){ sync, out_frame }; > > You completely forgot necessary changes to configure/the Makefile. > The > way you are doing it here means that you basically have the qsv > decoders > to rely on the H.264/HEVC/MPEG-1/2 decoders which is way too much. You are referring to the hypothetical case where one would disable one of the sw decoders while having a qsv decoder enabled, right? The SEI parsing code is not trivial and tied to those decoders (means using these contexts). It would be not a straightforward task to extract/separate those parts, that's why I preferred to just make that functionality accessible. I wouldn't mind when the QSV decoders would be dependent on those decoders being included in compilation, even more when considering that so many other hwaccel decoders have the same dependencies; DXVA2, D3D11VA, NVDEC, VAAPI. The question would be whether to not build the qsv decoders when the sw decoders are deselected or whether to build the sw decoder code even these are disabled. AFAIU, both would be possible? Or would you have a better idea? Thanks, sw _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".