From patchwork Fri Apr 30 11:34:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Brad Hards X-Patchwork-Id: 27538 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a11:4023:0:0:0:0 with SMTP id ky35csp333290pxb; Fri, 30 Apr 2021 04:35:31 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzeeOYxvuSovqWMyPfLZwIUkzCNwBcfAg+wnO2ysrNz5K1bPlS6H+sRfER4G6WRSfvRbIlI X-Received: by 2002:a17:906:dc8:: with SMTP id p8mr3820604eji.75.1619782531290; Fri, 30 Apr 2021 04:35:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1619782531; cv=none; d=google.com; s=arc-20160816; b=PY7rs8piLgXKsdgpf7n5c+/2AB2qLiSOPK6dwWq01FNFM4++gBaAgI2xf4wyK2hiqp 5m5CQrXFhumcLuiLKkf3xC2rJzxhgFSMXC++V7d28yaM2PWkeIkGbkuhcDdZgXirC7um wLwuUkUMt2imBpO06NZZJ+p9EAOZY+BPRYj08a5sMmf0Ui8+W7poF4RDV3A5VtV/7Ge0 w2MoGc3gSdeXKUdNDQ6Rc/evh5E5VRjN/Aa69T0F+HTDlGEqW8LhYt4ts0bmUzzyO/DB 8kwRUX93Oavt6SkzOAY+rWX//RAdi1gx17bcr3NafMmcg5OvFyedYdB4fkstu3B7PtOY EnTg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:delivered-to; bh=PjUh3Wvg2mNKt6AfhXUeebvC4gXKSmmVD/gO25y11H4=; b=ONMte4QCrRiFhYiS3dy7FFH/1C93jkm7kgndn9cmupbSj+cG09srzGff9AVsHXbX4f UTstqQ1MWb23D47tEoUpOzAaDsGJF7e0maby9v4wdtADc9fZDV+WNfcfUznhiGJ5inJt yhKOGKUhNZMYea0Vxxjs4GV26JJovdOyT3gXSlgY/NHE7HWq3aIUFHFS8Lt2zf0brTbh 0AfJ3U56lhvjUVq7nUfuX43SQPiMRJH/aLVguW1BiEjP8EqUDgX2BcFfeRsevxEktkTW RYjnrb02R7aDCZb2dMfDi6GHpmryCbl5ImXjKmxDjz4H2PcF+J6Sjzcqit/0dnDtmByS 7jzA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id p22si2892223ejg.624.2021.04.30.04.35.30; Fri, 30 Apr 2021 04:35:31 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 77A07689D84; Fri, 30 Apr 2021 14:34:57 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from cp1.nerdvana.net.au (cp1-new.nerdvana.net.au [113.212.99.70]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AC30C6883B3 for ; Fri, 30 Apr 2021 14:34:46 +0300 (EEST) Received: from ppp115-205.static.internode.on.net ([150.101.115.205]:41184 helo=audax.fritz.box) by cp1.nerdvana.net.au with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.93) (envelope-from ) id 1lcRPu-0000qy-Kj; Fri, 30 Apr 2021 21:34:42 +1000 From: Brad Hards To: ffmpeg-devel@ffmpeg.org Date: Fri, 30 Apr 2021 21:34:28 +1000 Message-Id: <20210430113432.308139-2-bradh@frogmouth.net> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210430113432.308139-1-bradh@frogmouth.net> References: <20210430113432.308139-1-bradh@frogmouth.net> MIME-Version: 1.0 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - cp1.nerdvana.net.au X-AntiAbuse: Original Domain - ffmpeg.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - frogmouth.net X-Get-Message-Sender-Via: cp1.nerdvana.net.au: authenticated_id: bradh@frogmouth.net X-Authenticated-Sender: cp1.nerdvana.net.au: bradh@frogmouth.net X-Source: X-Source-Args: X-Source-Dir: Subject: [FFmpeg-devel] [PATCH 1/5] libavutil: add convenience accessors for frame side data 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 Cc: Brad Hards Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 0B40eHdZmal0 Signed-off-by: Brad Hards --- libavutil/frame.c | 31 +++++++++++++++++++++++++++++++ libavutil/frame.h | 23 +++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/libavutil/frame.c b/libavutil/frame.c index 2ec59b44b1..9f9953c2b4 100644 --- a/libavutil/frame.c +++ b/libavutil/frame.c @@ -625,6 +625,37 @@ AVFrameSideData *av_frame_get_side_data(const AVFrame *frame, return NULL; } +AVFrameSideData *av_frame_get_side_data_n(const AVFrame *frame, + enum AVFrameSideDataType type, + const int side_data_instance) +{ + int i; + int n = 0; + + for (i = 0; i < frame->nb_side_data; i++) { + if (frame->side_data[i]->type == type) { + if (n == side_data_instance) { + return frame->side_data[i]; + } else { + n++; + } + } + } + return NULL; +} + +int av_frame_num_side_data(const AVFrame *frame, enum AVFrameSideDataType type) +{ + int i; + int num = 0; + for (i = 0; i < frame->nb_side_data; i++) { + if (frame->side_data[i]->type == type) { + num += 1; + } + } + return num; +} + static int frame_copy_video(AVFrame *dst, const AVFrame *src) { const uint8_t *src_data[4]; diff --git a/libavutil/frame.h b/libavutil/frame.h index ff2540a20f..8e94e3f679 100644 --- a/libavutil/frame.h +++ b/libavutil/frame.h @@ -839,11 +839,34 @@ AVFrameSideData *av_frame_new_side_data_from_buf(AVFrame *frame, AVFrameSideData *av_frame_get_side_data(const AVFrame *frame, enum AVFrameSideDataType type); +/** + * Find a specified instance of side data of a given type. + * + * @param frame a frame to find the side data in + * @param type type of the side data to find + * @param side_data_instance instance of the side data to return (0 base). + * + * @return a pointer to the n'th instance of side data of a given type on + * success, NULL if there are less than side_data_instance instances of the + * given type. + */ +AVFrameSideData *av_frame_get_side_data_n(const AVFrame *frame, + enum AVFrameSideDataType type, + const int side_data_instance); + /** * Remove and free all side data instances of the given type. */ void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type); +/** + * Get the number of instances of side data of a given type. + * + * @param frame a frame to find the side data in + * @param type type of the side data to find + * @return count of instances, which can be 0 + */ +int av_frame_num_side_data(const AVFrame *frame, enum AVFrameSideDataType type); /** * Flags for frame cropping. From patchwork Fri Apr 30 11:34:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Brad Hards X-Patchwork-Id: 27542 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a11:4023:0:0:0:0 with SMTP id ky35csp332974pxb; Fri, 30 Apr 2021 04:35:12 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwfL5ZWZk7WK/yd83ekYratIN/HW0j7gjrEyYIoounohF2bQNOQv5+ZKRWUrYKkzeb6Dd24 X-Received: by 2002:a17:906:5d0c:: with SMTP id g12mr3854152ejt.389.1619782511821; Fri, 30 Apr 2021 04:35:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1619782511; cv=none; d=google.com; s=arc-20160816; b=UBUrZePcVM1QGICHx6uQ0R0W8gqqgZHY/6Btiov2eo9Ou8hD+g5wUNClUDLGjiOuaN vLKOqZk5ffEDuVIk2reZ771qlo/OYv8dFW/TnIlfo/yL23/cRq+ncL32T2eEEf95BJDg nqrAyDs9Fjlggynd3edcP2BQM9505mwYEfClet1j4CtP7PRX9K1L1mOcsE1Y6S0YyweZ gafLPC32tyxrWckCzM+2B5fE0ZQ3G5jwOKipjxWxaC3IWpH5gmiEtvhauEjqEn7pOw2p cBwhSPJXYLYYlR2KJYULUaD0Py8MHqxH+SQv9LthTZ0spTgzZeIl4rM16oeDJg3q2xod 1o/w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:delivered-to; bh=pidMeAHG1hveFUyPLE+H/qja+lgIeSvqDrW5EODkZZE=; b=BDFzfBwRWw0aHZgLD2AUZPTZM9fbZrteGxumbOhq0ovQoo/RxtF6SWd33FQbyc+usW OXh1b5RoDGYb0CCdshlLymSUoxkiOP40QnRzEicB5+/4Seil4vy1MNhpnTitlf/wjNoL n2BO1SB8avEIdjZUjwXAF/mT0eqdiPYxvlgtje9LBEDbor5iHF6RI9WCoq2+1+BIyRtm 9XEpxbm/vt00MY/QXz085k0wQ+lOU46yKNaA0u8rmEZqIMoPKW8dcrY6ZQltu1DZ1vlO spKTKzpfyLgrhfJj7kspdh7DrbGcV2P3PznOF9DBVJKMkYBvQiGDsZO8tS9Em85o2es1 VNLQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id b14si319552edy.31.2021.04.30.04.35.11; Fri, 30 Apr 2021 04:35:11 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 213726899AB; Fri, 30 Apr 2021 14:34:55 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from cp1.nerdvana.net.au (cp1-new.nerdvana.net.au [113.212.99.70]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A68E968830E for ; Fri, 30 Apr 2021 14:34:46 +0300 (EEST) Received: from ppp115-205.static.internode.on.net ([150.101.115.205]:41184 helo=audax.fritz.box) by cp1.nerdvana.net.au with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.93) (envelope-from ) id 1lcRPu-0000qy-Nr; Fri, 30 Apr 2021 21:34:42 +1000 From: Brad Hards To: ffmpeg-devel@ffmpeg.org Date: Fri, 30 Apr 2021 21:34:29 +1000 Message-Id: <20210430113432.308139-3-bradh@frogmouth.net> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210430113432.308139-1-bradh@frogmouth.net> References: <20210430113432.308139-1-bradh@frogmouth.net> MIME-Version: 1.0 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - cp1.nerdvana.net.au X-AntiAbuse: Original Domain - ffmpeg.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - frogmouth.net X-Get-Message-Sender-Via: cp1.nerdvana.net.au: authenticated_id: bradh@frogmouth.net X-Authenticated-Sender: cp1.nerdvana.net.au: bradh@frogmouth.net X-Source: X-Source-Args: X-Source-Dir: Subject: [FFmpeg-devel] [PATCH 2/5] libavcodec: write out user data unregistered SEI for x264 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 Cc: Brad Hards Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: hue5FPAV4KsM Signed-off-by: Brad Hards --- libavcodec/libx264.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c index 22c91d8df7..6d4cee55c0 100644 --- a/libavcodec/libx264.c +++ b/libavcodec/libx264.c @@ -31,6 +31,7 @@ #include "internal.h" #include "packet_internal.h" #include "atsc_a53.h" +#include "sei.h" #if defined(_MSC_VER) #define X264_API_IMPORTS 1 @@ -303,6 +304,7 @@ static int X264_frame(AVCodecContext *ctx, AVPacket *pkt, const AVFrame *frame, int64_t wallclock = 0; X264Opaque *out_opaque; AVFrameSideData *sd; + int num_unregistered_sei; x264_picture_init( &x4->pic ); x4->pic.img.i_csp = x4->params.i_csp; @@ -438,6 +440,19 @@ static int X264_frame(AVCodecContext *ctx, AVPacket *pkt, const AVFrame *frame, } } } + num_unregistered_sei = av_frame_num_side_data(frame, AV_FRAME_DATA_SEI_UNREGISTERED); + x4->pic.extra_sei.payloads = av_realloc_array(x4->pic.extra_sei.payloads, + x4->pic.extra_sei.num_payloads + num_unregistered_sei, + sizeof(x264_sei_payload_t)); + for (int i = 0; i < num_unregistered_sei; i++) { + sd = av_frame_get_side_data_n(frame, AV_FRAME_DATA_SEI_UNREGISTERED, i); + if (sd) { + x4->pic.extra_sei.payloads[x4->pic.extra_sei.num_payloads + i].payload = sd->data; + x4->pic.extra_sei.payloads[x4->pic.extra_sei.num_payloads + i].payload_size = sd->size; + x4->pic.extra_sei.payloads[x4->pic.extra_sei.num_payloads + i].payload_type = SEI_TYPE_USER_DATA_UNREGISTERED; + } + } + x4->pic.extra_sei.num_payloads += num_unregistered_sei; } do { From patchwork Fri Apr 30 11:34:30 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Brad Hards X-Patchwork-Id: 27540 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a11:4023:0:0:0:0 with SMTP id ky35csp332802pxb; Fri, 30 Apr 2021 04:35:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwwhE7SAtNy9IxA/4MIcUvGilifihhQLHGwBmi/C3lalUsLZyzL2fKcXrKgZ7eFxrKpPBYJ X-Received: by 2002:aa7:c049:: with SMTP id k9mr5345770edo.56.1619782500135; Fri, 30 Apr 2021 04:35:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1619782500; cv=none; d=google.com; s=arc-20160816; b=NuzaUvRb9H2P5bJ93+1O7wZEdM++JvP8kVIkvPANBAgC5TxoQtbI0dUuQUuhK/mJ9X pr8iaZB711sBH1h5y/oFyf9lD3HqDW2CuicrFNT4iyoWoOTOdinGyadXy4z2KRNH59Rl 3MXZulr2BhHCxWC2S+raw59ESU9Zs8loQf0vkpJwt3pzviJQMSzWtGyo7nryF3EJGLC4 224xyLU3aj4pzYP9rp/pF9rEQQRTOHQ7MOjsGiEQWfqGkf/umzMXpQajCQSvpf60zdJC guqiKZIb4CRJZJ3pbSBolwR1jRyjwshs7ZlIkdcR1ndSx4QJtHPk8sgPT2vUhtYHZhAd CIbw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:delivered-to; bh=rEppIPlt4oPB5WuG7dwxUQdI4BFr/IOvvfLJaq/+pyc=; b=BWe3m0uLop8P/24wS/0NYPF1V8ASA4yypQg8FsLw0Wwol8fH70X88ftA6iaMm8qryY XSVuddr/sbes8NRFQBTvBsq7D3FLPneYAhNR0HlQMNz9MMKOJZnT+rBGHchwe8dEMa6o UmH1I8GXLSHE/k1HoxHJ1YiAYuL4SNRQvduUiz4+SKHFJhbqRwMM4kZO1muJa2Jx3FCa BaLV3TKGG0q9X3bWRiIyzCLp58k8jQZh9Q0h9LPINNVK+O/M+769LfFgHmDTNud9FPLX hxKyj9uI9OudBqVNKY3svxjlKIu60kR2FDFHRNAFN/whm0kEXQy7R/8j+8GAWV8LIgY6 oihQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id q11si2950439eju.518.2021.04.30.04.34.59; Fri, 30 Apr 2021 04:35:00 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 01FE3689916; Fri, 30 Apr 2021 14:34:54 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from cp1.nerdvana.net.au (cp1-new.nerdvana.net.au [113.212.99.70]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A67136881A9 for ; Fri, 30 Apr 2021 14:34:46 +0300 (EEST) Received: from ppp115-205.static.internode.on.net ([150.101.115.205]:41184 helo=audax.fritz.box) by cp1.nerdvana.net.au with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.93) (envelope-from ) id 1lcRPu-0000qy-Qi; Fri, 30 Apr 2021 21:34:42 +1000 From: Brad Hards To: ffmpeg-devel@ffmpeg.org Date: Fri, 30 Apr 2021 21:34:30 +1000 Message-Id: <20210430113432.308139-4-bradh@frogmouth.net> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210430113432.308139-1-bradh@frogmouth.net> References: <20210430113432.308139-1-bradh@frogmouth.net> MIME-Version: 1.0 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - cp1.nerdvana.net.au X-AntiAbuse: Original Domain - ffmpeg.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - frogmouth.net X-Get-Message-Sender-Via: cp1.nerdvana.net.au: authenticated_id: bradh@frogmouth.net X-Authenticated-Sender: cp1.nerdvana.net.au: bradh@frogmouth.net X-Source: X-Source-Args: X-Source-Dir: Subject: [FFmpeg-devel] [PATCH 3/5] libavcodec: write out user data unregistered SEI for x265 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 Cc: Brad Hards Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: OxEQQCucshj7 Signed-off-by: Brad Hards --- libavcodec/libx265.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/libavcodec/libx265.c b/libavcodec/libx265.c index a1bd205201..3dceb3d165 100644 --- a/libavcodec/libx265.c +++ b/libavcodec/libx265.c @@ -484,6 +484,8 @@ static int libx265_encode_frame(AVCodecContext *avctx, AVPacket *pkt, int nnal; int ret; int i; + AVFrameSideData *sd; + int num_unregistered_sei; ctx->api->picture_init(ctx->params, &x265pic); @@ -515,6 +517,17 @@ static int libx265_encode_frame(AVCodecContext *avctx, AVPacket *pkt, memcpy(x265pic.userData, &pic->reordered_opaque, sizeof(pic->reordered_opaque)); } + num_unregistered_sei = av_frame_num_side_data(pic, AV_FRAME_DATA_SEI_UNREGISTERED); + x265pic.userSEI.payloads = av_realloc_array(x265pic.userSEI.payloads, x265pic.userSEI.numPayloads + num_unregistered_sei, sizeof(x265_sei_payload)); + for (i = 0; i < num_unregistered_sei; i++) { + sd = av_frame_get_side_data_n(pic, AV_FRAME_DATA_SEI_UNREGISTERED, i); + if (sd) { + x265pic.userSEI.payloads[x265pic.userSEI.numPayloads + i].payload = sd->data; + x265pic.userSEI.payloads[x265pic.userSEI.numPayloads + i].payloadSize = sd->size; + x265pic.userSEI.payloads[x265pic.userSEI.numPayloads + i].payloadType = USER_DATA_UNREGISTERED; + } + } + x265pic.userSEI.numPayloads += num_unregistered_sei; } ret = ctx->api->encoder_encode(ctx->encoder, &nal, &nnal, From patchwork Fri Apr 30 11:34:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Brad Hards X-Patchwork-Id: 27541 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a11:4023:0:0:0:0 with SMTP id ky35csp333129pxb; Fri, 30 Apr 2021 04:35:21 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxfEQKVw4GxtC9ofd9V88AXzDmWY4Z5Ye9Gg+04mKC+9tQFu2InzL9i68Hr2nJuZOvbmpsI X-Received: by 2002:a17:906:d18a:: with SMTP id c10mr3778100ejz.271.1619782521366; Fri, 30 Apr 2021 04:35:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1619782521; cv=none; d=google.com; s=arc-20160816; b=p6COFYjpuYgLlP1clemdJQuIatqElj+cySp1RaaWIhGUJwtKYLpHDlUediaRW0FFb2 FAgloW4HLFxW3hLM6TOV2ggk1fe5MY9WVMU4ws/ebs0jJXVxHJoQJg2A3628so55SW79 p4RmE0T4srSXdoeOYQ3U+XYQpC2k7/pnmYwOy6Q5hBmDAEMod1Fbo2Okahax9wUhcJOa gpaHXqsDE3KmLZNDrkdgH5tUPGon96bxKZmMUhMj8tpTd/IsIAea+vQVFLQLGcARIagf NkSYcARPlUdCg3Y5/18cNbScBuuJUDd1g+UE3yNtgQ0yFS4OVpcAaASbxCCZD+rH8NI8 3smw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:delivered-to; bh=ZwxVGDRurjaUjrV1tf/5Zuy2SPCpWgtwBwlnDCvnqyk=; b=acQXdy3NMvdmCKo2xCVEFF7xvQOLmifsOy1YC5Dx2VZ3jVZ4QIIuY8QkzETlw+K9kH o0oAbWulm1luc4Tc5TfmIoMhJMC1bK8zjPLU1NabnhEeN6guSXMWiatjXXJp/UVLoijt Sy9ApYHJwt3JU4VL1fr05vVdpY+HLVeZ3vJOI+JUcfXuos2JFxJ2YBcIbMYDkrAQRjYV y2IOUis8tGd1jZoLNhAeNoAt7hfTVavCZLpq0pt7m5qN6LiBjOCwJmRzr88XN3Y36/JY gLqijV47alo1iUbVD6+Dw3T188phi27sVbFY0apEyp4uvozjBwv/H6m5CrGePSPjk/9H bM+Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id v18si1731872edb.78.2021.04.30.04.35.20; Fri, 30 Apr 2021 04:35:21 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5173A688133; Fri, 30 Apr 2021 14:34:56 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from cp1.nerdvana.net.au (cp1-new.nerdvana.net.au [113.212.99.70]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A9653688342 for ; Fri, 30 Apr 2021 14:34:46 +0300 (EEST) Received: from ppp115-205.static.internode.on.net ([150.101.115.205]:41184 helo=audax.fritz.box) by cp1.nerdvana.net.au with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.93) (envelope-from ) id 1lcRPu-0000qy-Tl; Fri, 30 Apr 2021 21:34:42 +1000 From: Brad Hards To: ffmpeg-devel@ffmpeg.org Date: Fri, 30 Apr 2021 21:34:31 +1000 Message-Id: <20210430113432.308139-5-bradh@frogmouth.net> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210430113432.308139-1-bradh@frogmouth.net> References: <20210430113432.308139-1-bradh@frogmouth.net> MIME-Version: 1.0 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - cp1.nerdvana.net.au X-AntiAbuse: Original Domain - ffmpeg.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - frogmouth.net X-Get-Message-Sender-Via: cp1.nerdvana.net.au: authenticated_id: bradh@frogmouth.net X-Authenticated-Sender: cp1.nerdvana.net.au: bradh@frogmouth.net X-Source: X-Source-Args: X-Source-Dir: Subject: [FFmpeg-devel] [PATCH 4/5] libavcodec: write out user data unregistered SEI for nvenc 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 Cc: Brad Hards Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: ZykB0y6VlyDl Signed-off-by: Brad Hards --- libavcodec/nvenc.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c index 0dcd93a99c..1a895a64f4 100644 --- a/libavcodec/nvenc.c +++ b/libavcodec/nvenc.c @@ -2173,6 +2173,8 @@ static int nvenc_send_frame(AVCodecContext *avctx, const AVFrame *frame) NV_ENC_SEI_PAYLOAD sei_data[8]; int sei_count = 0; int i; + AVFrameSideData *sd; + int num_unregistered_sei; NvencContext *ctx = avctx->priv_data; NvencDynLoadFunctions *dl_fn = &ctx->nvenc_dload_funcs; @@ -2261,6 +2263,20 @@ static int nvenc_send_frame(AVCodecContext *avctx, const AVFrame *frame) } } + num_unregistered_sei = av_frame_num_side_data(frame, AV_FRAME_DATA_SEI_UNREGISTERED); + for (int i = 0; i < num_unregistered_sei; i++) { + sd = av_frame_get_side_data_n(frame, AV_FRAME_DATA_SEI_UNREGISTERED, i); + if (sd) { + sei_data[sei_count].payloadSize = sd->size; + sei_data[sei_count].payloadType = SEI_TYPE_USER_DATA_UNREGISTERED; + sei_data[sei_count].payload = av_memdup(sd->data, sd->size); + sei_count ++; + if (sei_count >= 8) { + break; + } + } + } + nvenc_codec_specific_pic_params(avctx, &pic_params, sei_data, sei_count); } else { pic_params.encodePicFlags = NV_ENC_PIC_FLAG_EOS; From patchwork Fri Apr 30 11:34:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Brad Hards X-Patchwork-Id: 27539 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a11:4023:0:0:0:0 with SMTP id ky35csp333433pxb; Fri, 30 Apr 2021 04:35:40 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyK9B72pleUS43v1XQPkCuVlNsro76IwO90B8oLzs8NBKKEK15aSTsFG8IALrF7xIE0o+iv X-Received: by 2002:a17:906:1fd1:: with SMTP id e17mr3893319ejt.419.1619782540353; Fri, 30 Apr 2021 04:35:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1619782540; cv=none; d=google.com; s=arc-20160816; b=rXoOHW8gBNjA80evlnnV59nmEQfd0jUCEILL+5WLeiWxXLnfv8Xg17pgRGGlyW1EbH es19Fkm0B6gYb9jm2+4qHOX799DmNmLSBwV/MdtTIISbsq1OiWF0QhdnoYNK8UIGF99b Jejw2D/XMX1Y9Os9B4A1w3CCjcga+YWJv4hw0LSJhOaoHIOuUm08Rkqq5iyAYePhzxVk eqbBxidD/iPNcrEOIwIRdl86nAqtyZp8JMuz1QJCzUVt1PcGDPivR6kNRqHoIxhy48hS Sh5r3ibyKulPDIptUH1wu+61IzAn0MbJI4ld4yyWhDWFeMwQFOy2JuFR8NF2TiEWhSr6 9J/Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:delivered-to; bh=NxsuuojewFPdzkup8c7icD8StTdcsOCp3/digFqAf9I=; b=IsFcrfmgBKO23pQyjpygDf0tDINSKwHCODR//ulMgZ4DsoHa6JhvlSMi6qif90RhIb v02qfRmwIWu4j57PbMZKNFvlR5toLmKlAvjevZ9Wr7QJC/QIBKloJ0xuuGRIKQBl1VQp Lmk6vgkwv4g2Ko+lQbbku/SBJpOAujr7DiQMokNn3cftCPEHunL2aSzEcwBCYZojhKRW qHm/KaHgNBUVxEdVuhiP8iQllAfukErg/U67/vn6Rz2aOqGBC9QCVYPtiVOFZTrcHb2d iSsSbSTkAGSAu8D9MJKFTo1J5eolqKVVSQIqe3FjJmYnF1oJ1L3Sy48AAU7evcySvbjd jWCQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id n26si3039151ejx.488.2021.04.30.04.35.40; Fri, 30 Apr 2021 04:35:40 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7DA7768830E; Fri, 30 Apr 2021 14:34:58 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from cp1.nerdvana.net.au (cp1-new.nerdvana.net.au [113.212.99.70]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AF0C26891CF for ; Fri, 30 Apr 2021 14:34:46 +0300 (EEST) Received: from ppp115-205.static.internode.on.net ([150.101.115.205]:41184 helo=audax.fritz.box) by cp1.nerdvana.net.au with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.93) (envelope-from ) id 1lcRPv-0000qy-0u; Fri, 30 Apr 2021 21:34:43 +1000 From: Brad Hards To: ffmpeg-devel@ffmpeg.org Date: Fri, 30 Apr 2021 21:34:32 +1000 Message-Id: <20210430113432.308139-6-bradh@frogmouth.net> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210430113432.308139-1-bradh@frogmouth.net> References: <20210430113432.308139-1-bradh@frogmouth.net> MIME-Version: 1.0 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - cp1.nerdvana.net.au X-AntiAbuse: Original Domain - ffmpeg.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - frogmouth.net X-Get-Message-Sender-Via: cp1.nerdvana.net.au: authenticated_id: bradh@frogmouth.net X-Authenticated-Sender: cp1.nerdvana.net.au: bradh@frogmouth.net X-Source: X-Source-Args: X-Source-Dir: Subject: [FFmpeg-devel] [PATCH 5/5] doc: add example for user data unregistered SEI encoding 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 Cc: Brad Hards Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 02m6lfDxRFA6 Signed-off-by: Brad Hards --- configure | 2 + doc/examples/.gitignore | 1 + doc/examples/Makefile | 1 + doc/examples/Makefile.example | 1 + doc/examples/encode_unregistered.c | 205 +++++++++++++++++++++++++++++ 5 files changed, 210 insertions(+) create mode 100644 doc/examples/encode_unregistered.c diff --git a/configure b/configure index 6580859ef2..1fad5b29ca 100755 --- a/configure +++ b/configure @@ -1708,6 +1708,7 @@ EXAMPLE_LIST=" demuxing_decoding_example encode_audio_example encode_video_example + encode_unregistered_example extract_mvs_example filter_audio_example filtering_audio_example @@ -3708,6 +3709,7 @@ decode_video_example_deps="avcodec avutil" demuxing_decoding_example_deps="avcodec avformat avutil" encode_audio_example_deps="avcodec avutil" encode_video_example_deps="avcodec avutil" +encode_unregistered_example_deps="avcodec avutil" extract_mvs_example_deps="avcodec avformat avutil" filter_audio_example_deps="avfilter avutil" filtering_audio_example_deps="avfilter avcodec avformat avutil" diff --git a/doc/examples/.gitignore b/doc/examples/.gitignore index 44960e1de7..d3f7739e68 100644 --- a/doc/examples/.gitignore +++ b/doc/examples/.gitignore @@ -4,6 +4,7 @@ /decode_video /demuxing_decoding /encode_audio +/encode_unregistered /encode_video /extract_mvs /filter_audio diff --git a/doc/examples/Makefile b/doc/examples/Makefile index 81bfd34d5d..00ef609c7b 100644 --- a/doc/examples/Makefile +++ b/doc/examples/Makefile @@ -5,6 +5,7 @@ EXAMPLES-$(CONFIG_DECODE_VIDEO_EXAMPLE) += decode_video EXAMPLES-$(CONFIG_DEMUXING_DECODING_EXAMPLE) += demuxing_decoding EXAMPLES-$(CONFIG_ENCODE_AUDIO_EXAMPLE) += encode_audio EXAMPLES-$(CONFIG_ENCODE_VIDEO_EXAMPLE) += encode_video +EXAMPLES-$(CONFIG_ENCODE_UNREGISTERED_EXAMPLE) += encode_unregistered EXAMPLES-$(CONFIG_EXTRACT_MVS_EXAMPLE) += extract_mvs EXAMPLES-$(CONFIG_FILTER_AUDIO_EXAMPLE) += filter_audio EXAMPLES-$(CONFIG_FILTERING_AUDIO_EXAMPLE) += filtering_audio diff --git a/doc/examples/Makefile.example b/doc/examples/Makefile.example index a232d97f98..f26a6597f8 100644 --- a/doc/examples/Makefile.example +++ b/doc/examples/Makefile.example @@ -18,6 +18,7 @@ EXAMPLES= avio_list_dir \ demuxing_decoding \ encode_audio \ encode_video \ + encode_unregistered \ extract_mvs \ filtering_video \ filtering_audio \ diff --git a/doc/examples/encode_unregistered.c b/doc/examples/encode_unregistered.c new file mode 100644 index 0000000000..e9309460c0 --- /dev/null +++ b/doc/examples/encode_unregistered.c @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2001 Fabrice Bellard + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/** + * @file + * video encoding with SEI (user unregistered) API example + * + * @example encode_unregistered.c + */ + +#include +#include +#include + +#include + +#include +#include + +static void encode(AVCodecContext *enc_ctx, AVFrame *frame, AVPacket *pkt, + FILE *outfile) +{ + int ret; + + /* send the frame to the encoder */ + if (frame) + printf("Send frame %3" PRId64 "\n", frame->pts); + + ret = avcodec_send_frame(enc_ctx, frame); + if (ret < 0) + { + fprintf(stderr, "Error sending a frame for encoding\n"); + exit(1); + } + + while (ret >= 0) + { + ret = avcodec_receive_packet(enc_ctx, pkt); + if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) + return; + else if (ret < 0) + { + fprintf(stderr, "Error during encoding\n"); + exit(1); + } + + printf("Write packet %3" PRId64 " (size=%5d)\n", pkt->pts, pkt->size); + fwrite(pkt->data, 1, pkt->size, outfile); + av_packet_unref(pkt); + } +} + +int main(int argc, char **argv) +{ + const char *filename, *codec_name; + const AVCodec *codec; + AVCodecContext *c = NULL; + int i, ret, x, y; + FILE *f; + AVFrame *frame; + AVPacket *pkt; + AVFrameSideData *side_data; + // This is from MISB ST 2101 + char sei_message[] = {0xa5, 0x50, 0x52, 0xaf, 0x52, 0x16, 0x5f, 0x45, + 0xa3, 0x18, 0x1c, 0xfc, 0x7a, 0xbb, 0xc2, 0x67, + 0x01, 0x70, 0xF5, 0x92, 0xF0, 0x23, 0x73, 0x36, + 0x4A, 0xF8, 0xAA, 0x91, 0x62, 0xC0, 0x0F, 0x2E, + 0xB2, 0xDA, 0x16, 0xB7, 0x43, 0x41, 0x00, 0x08, + 0x41, 0xA0, 0xBE, 0x36, 0x5B, 0x5A, 0xB9, 0x6A, + 0x36, 0x45}; + + if (argc <= 2) { + fprintf(stderr, "Usage: %s \n", argv[0]); + exit(0); + } + filename = argv[1]; + codec_name = argv[2]; + + codec = avcodec_find_encoder_by_name(codec_name); + if (!codec) { + fprintf(stderr, "Codec '%s' not found\n", codec_name); + exit(1); + } + + c = avcodec_alloc_context3(codec); + if (!c) + { + fprintf(stderr, "Could not allocate video codec context\n"); + exit(1); + } + + pkt = av_packet_alloc(); + if (!pkt) + exit(1); + + c->bit_rate = 400000; + c->width = 352; + c->height = 288; + /* frames per second */ + c->time_base = (AVRational){1, 25}; + c->framerate = (AVRational){25, 1}; + c->gop_size = 10; + c->max_b_frames = 0; + c->pix_fmt = AV_PIX_FMT_YUV420P; + if (codec->id == AV_CODEC_ID_H264) + av_opt_set(c->priv_data, "preset", "medium", 0); + + /* open it */ + ret = avcodec_open2(c, codec, NULL); + if (ret < 0) + { + fprintf(stderr, "Could not open codec: %s\n", av_err2str(ret)); + exit(1); + } + + f = fopen(filename, "wb"); + if (!f) + { + fprintf(stderr, "Could not open %s\n", filename); + exit(1); + } + + frame = av_frame_alloc(); + if (!frame) + { + fprintf(stderr, "Could not allocate video frame\n"); + exit(1); + } + frame->format = c->pix_fmt; + frame->width = c->width; + frame->height = c->height; + side_data = av_frame_new_side_data(frame, AV_FRAME_DATA_SEI_UNREGISTERED, sizeof(sei_message)); + if (!side_data) + { + fprintf(stderr, "Could not allocate the video frame side data\n"); + exit(1); + } + memcpy(side_data->data, sei_message, side_data->size); + + ret = av_frame_get_buffer(frame, 0); + if (ret < 0) + { + fprintf(stderr, "Could not allocate the video frame data\n"); + exit(1); + } + + /* encode 1 second of video */ + for (i = 0; i < 25; i++) + { + fflush(stdout); + + /* make sure the frame data is writable */ + ret = av_frame_make_writable(frame); + if (ret < 0) + exit(1); + + /* prepare a dummy image */ + /* Y */ + for (y = 0; y < c->height; y++) { + for (x = 0; x < c->width; x++) { + frame->data[0][y * frame->linesize[0] + x] = x + y + i * 3; + } + } + + /* Cb and Cr */ + for (y = 0; y < c->height/2; y++) { + for (x = 0; x < c->width/2; x++) { + frame->data[1][y * frame->linesize[1] + x] = 128 + y + i * 2; + frame->data[2][y * frame->linesize[2] + x] = 64 + x + i * 5; + } + } + + frame->pts = i; + encode(c, frame, pkt, f); + } + + /* flush the encoder */ + encode(c, NULL, pkt, f); + fclose(f); + + avcodec_free_context(&c); + av_frame_free(&frame); + av_packet_free(&pkt); + + return 0; +}