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 DFE56432DC for ; Tue, 28 Jun 2022 04:17:02 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5746168B8D7; Tue, 28 Jun 2022 07:16:59 +0300 (EEST) Received: from EUR01-HE1-obe.outbound.protection.outlook.com (mail-oln040092065022.outbound.protection.outlook.com [40.92.65.22]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CB4D368B6FA for ; Tue, 28 Jun 2022 07:16:52 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=U9zBuQ96dCkiaAuxiBW8mddvix6AK4cedFuKAa0OCYIu+67vTmR4X8BXaJXdqwbpIphc3CPzvPz5HZCYbEiL+RLp9TFu1PUYRiuRhErZPFCPL05S17jWwCPlAkCLYEn8bKhKqkaBQ48ZbK/wJesvUqAQfW+kwkJ92Y5qBwrgSY+ju+JQPeK74Y6CnNjy8lOFkanL7yd8l6pqH00kzLBJhjLQiyJ2VTSz+n4PfvCBgb/L98WWuGhlYtkX6GnIQ6JUGm0YNdcjuTO8JlHyBjVbWWgsW0mYxia0h6XHifpWipXNDJ+Vkc2kc7WJDog9ZHAhxvuCpG2T9JkmEdnIy98OWw== 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=fBakYuWFvdpbWNaOW5DvcGjRLPsbpakZ1/EyZgRNHts=; b=WH60HQWq3z+6t99pbeShtVJKSj9RwBXLAJo98BgltrPsG6PaWhBQWJuDUkQ6oOoXHGsZHXfiiFxlXUwaq9Xo+/Vp3mK4sZ77MVz9fOo8pkf1TmLIB03N4efwNKZXbobNum0Mt3m19CVb6kM3XINdyvl3iQFXMXoL08fdDfJIS1rz0IF9MxRCqLW1rHqQuKJHkBfQA8SQettWeYfVjvRAjXTVowI5wkLlcFKz4HAJmQVISdz4/yf6cKtRbRWUqp/Wg0IL4irf6jpnTaM+pKJpcfNXN/fOEdOyr4ejdSphzxYgtUQXrLyUlE8bWBY6BtYn/hb1nGjprPjtlxoMadIBzw== 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=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=fBakYuWFvdpbWNaOW5DvcGjRLPsbpakZ1/EyZgRNHts=; b=nFr8rbAFDhoisKxdpLAfkMCnV0TmTe1rS2OB6WcsOSzVn1366WnRt5o70E9FoOKiLh5MCnQsRRQR16qD6xOh3eHWFKKITfa9hzneslXwLB6MnocLYNM+2Xj1xlgr8SOVPE6aryJ0Xh8V+D8Sbq94gUGRYsR9rD60A0KNFhdsIGrktAzCLinUhzihi8J68dQ+RvS/EZmefF4qvhnRXruU/bV9bqrOZVFrarFqIzZIEC9qngIt8y3cGEzt6wz9AHorhUjjuYklV2DDBxi+wzZBkQi4MKhXmmQKv8Of3Soqi6ur5na2o0WF7geZzkGIQQVJCxTpWDa10tfEZQbwlce+TQ== Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) by PA4PR01MB7631.eurprd01.prod.exchangelabs.com (2603:10a6:102:c9::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5373.17; Tue, 28 Jun 2022 04:16:50 +0000 Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::60b9:9f29:40cc:f01c]) by DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::60b9:9f29:40cc:f01c%10]) with mapi id 15.20.5373.018; Tue, 28 Jun 2022 04:16:50 +0000 Message-ID: Date: Tue, 28 Jun 2022 06:16:48 +0200 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org References: <3f2588563e96ce105fddde849e86acf7cb3e2dbf.1656286888.git.ffmpegagent@gmail.com> Content-Language: en-US In-Reply-To: <3f2588563e96ce105fddde849e86acf7cb3e2dbf.1656286888.git.ffmpegagent@gmail.com> X-TMN: [IGHqQoYv8FFuh7tHauJ2jrqodpzNkAZE] X-ClientProxiedBy: AS8PR07CA0008.eurprd07.prod.outlook.com (2603:10a6:20b:451::20) To DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) X-Microsoft-Original-Message-ID: <1e43b38e-2e45-402b-6c2a-113dd9ac16e3@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 18a1d427-6c9c-4b05-e782-08da58bd05fa X-MS-TrafficTypeDiagnostic: PA4PR01MB7631:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: CbNh/MZ1/Xz+lOEZKq0XIDTwkZgklQ6k4/xltH3oCPUU6jtj0oXpwutdhXkyzI6JUZZ5+blt+KCFSZsSbc2zXEq1e+2jCoRzyexvNOgtBeWwnwe3WDWwZ1Z/9asI2xp7LBvao9SxYegFNCqz/wlC3zEnAkFC/RLxUHnRmQYowtqeJWuwmfVfC2mHljrtTgBq5Bs/YSlR9e3re0oPMbrfv2R7mfZpF7JUiuaZ5/Tn6i08dGtIsFTPg02r4m0PLcJNjcY2r+z6h5fYO2+IGowazJYiue7rM3n/cUwnx9ZD0Ayg+rGBA8T4dqEC28dK6cSllWBu7M/R6OgpZYjNwc6BUP7awwIwo0SmGckpqZqHmHrus6vsldGHrgvdhzJt6Z1VHUFgGV6JGzkYOZPkYbzo6IyzjfLmMnReS893nBdJNaP+ZVDb+uT5s2F2JUfCLyB07393d5SDQXMyIXpmoSXfMWwaUJhuNAMEy1d9Z7f6XqzgZC9E4Zlf7FRTD0+vU85LLfm+hT0KpP1+IRRRn3BuKW/l1R6M8KJTbukdFBoRHjQMHUybbYfAXLO/sNOy6iHubpfjRZQG/E7+Vhw9uSidWb1YQXbl/zyIbUSAatKzoU/qPQgcM304tQfFX5tvdO4UGOeEv5icuHvZ8Vp2qoPLpQ== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?RmNrbGg2UVlqVXgxdGdLOWhHWGtDcDJCOFZDbVl2K0EyYVc1ZVBkVFhWbzEv?= =?utf-8?B?NFhNUFI3cVdVc1JBdm1GK0pwNE5XeUp2RlZLK0ZUMFZwdjIxTzY3cGdJOXFh?= =?utf-8?B?dXJld25xMWVTcVRUQjRjZG95MFVvR1BVTlUvUUt4dWhuZGR3ZGNCZDk2TmE1?= =?utf-8?B?b2E2ZUlneGJZYXphMktTRWUxVTd0MmE4a2JNaWIwdmFRL1lwVnFVcFNsTVBi?= =?utf-8?B?OTNpeXpCODNoeHRMUUNOeGROK2lPNTRxTCtvcUl4MnYwdzNaQm5DREJqejRL?= =?utf-8?B?Sm1NamRYQ0E1Q0RzSHJwN1hJUzQrbWRvbm5jVlMycFpncCtzenlxNkpyOElk?= =?utf-8?B?QWRrUGhqSWtXODgyZUJNQ2FXWk9BZHJQVVh1WnEwU3NyNmZFWlRuWkwwc0JP?= =?utf-8?B?TkpiTnF0RVJ3SUV5cDFjeEFCTHpOeVh1YkNPOG82RS9yM08veUVCNXpncENk?= =?utf-8?B?QnNmR09qNDN3SnlGSklVQURJOFJYUm1OZjNxbG85Z1ZZNFJoQXVaMkkybVpq?= =?utf-8?B?SDZYNFZyVVVyWTNGbElyWmxvRTNCLzNvcFc3RERhNlYrOSt5MGloOUFIMW8w?= =?utf-8?B?U3ZvUGVvMWtpQzd1Nm5qTDg3bWFjNmtNdlJBeXhRQldEWi9td3lHZUJFUlNY?= =?utf-8?B?azhyMENwTWtScUZCcEpQcjR4UEIrVWFsa09BbGN4YUZyY2w5bC94VDl4S2Ri?= =?utf-8?B?dDFLS3Zpa0xqSFBvSkcvSWhacjRuSVo2cXZaUWM5bWM4UlNpdzlEdCtYamxD?= =?utf-8?B?RmNOVVprQnlOZ0RwOGVxS1o2cjFJL0pneklVSmZrMGdwU1F5M1JZS2xBRE9m?= =?utf-8?B?WkRjT3BaVW5GMU1td2RmaDBFNXBPWW96bFl5QWJ4Y25DcXRXbGdxWElZUVZV?= =?utf-8?B?SlFhRm1FQ2VzRTlWZEc0Nm1UKzdVc095WXI5T0Z6YTJQSWEveFdnMEc2VG1E?= =?utf-8?B?bjltZ2FGNzdHb2txUlc0OEJYdEVreE9oQnFXQkNvWEQrS1lPZDRQa0FPTmdu?= =?utf-8?B?bWhUdSt1UzdBaUNhajlqSHgwYWNMRTljczZqd2RVZEhDUVFnemlmQmJ5VnVh?= =?utf-8?B?NlQxWVR6WkJRUDV2ZnQvZ3E3TEx5eGY0cEhCbGpNQ0hsL2RBNktrZDNRQmh4?= =?utf-8?B?ZHBLTkNuVU9XOVNaaWJUbDh1VHBhYWxTejdCaGxDd0d2T3VKanN4Qlh4RWpv?= =?utf-8?B?T2MwZlNIV3F4VmpOVU9qNzB4aTJSQnIvaFpudWZtc1U4dnRoOTFsd3ZsdFpz?= =?utf-8?B?VXVUdUkva09USVRTYTNmbjA5b0NzZ2l3SExGK1ZxenhLTzFEUVhSb1M1ODNH?= =?utf-8?B?eksxUmZXck0wWVZZelpSSjJESUZyWDFWbHNhWGV2NXMwSk5sY0IySGlkRU1J?= =?utf-8?B?aHgyTE9ISUQyRVJJbW84WnBXeC82SWJtS2hyOXlXYTE5dFA2N1I2MWVtOTJO?= =?utf-8?B?c3gvWCtRMTByZTBicENWSXpiTkJVZStjeDJORzBZbVBqbnYram1Za2lYR21n?= =?utf-8?B?ZnQxZlZ4blZzQklVNllydDdybm1nbnlaOVJNNEtXQ2tranVTaXpaK0o5dzl1?= =?utf-8?B?TklqSEN2d3BjNkhXU3ZQUjIwSWdSR01CbkRtSndQUzdkSXpqa1R3cmkvRU56?= =?utf-8?B?dGNFeGJmQ1BKT3ZVNm9lQm01clVHQytMZm5PajQ5a1l1T2VDOVIrRnF2azdK?= =?utf-8?B?Qm5sc3poa1JsYjVXcVhpdDVUY2RNK2syRHcvTzRMSk1Gb3FuS2RUVE9Bc1ly?= =?utf-8?Q?B46wXv07n6BJOx3X9o=3D?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 18a1d427-6c9c-4b05-e782-08da58bd05fa X-MS-Exchange-CrossTenant-AuthSource: DB6PR0101MB2214.eurprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Jun 2022 04:16:50.3270 (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: PA4PR01MB7631 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: 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. - Andreas _______________________________________________ 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".