From patchwork Sun Feb 4 09:02:32 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "J. Dekker" X-Patchwork-Id: 46005 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:7b08:b0:19e:8a94:b663 with SMTP id s8csp133641pzh; Sun, 4 Feb 2024 01:02:59 -0800 (PST) X-Google-Smtp-Source: AGHT+IGU7ra7p4LMjP2LXaTohcRPwSKhOA8QtVvTzGOOKHTAVlnK/U0KhBMABjwGkokDHXDsrO3l X-Received: by 2002:a17:906:e90:b0:a35:570f:dae3 with SMTP id p16-20020a1709060e9000b00a35570fdae3mr7099708ejf.2.1707037379484; Sun, 04 Feb 2024 01:02:59 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1707037379; cv=none; d=google.com; s=arc-20160816; b=Ki4NWPAsLimMqbPICdiNLSOSPaF0pINT1SxUNh5qubV614xc0/+j7vGoG/YUStUrZj BdBN6zXr32PZBmwqa7wRvr/Q6MgW8/3P6zKv5A/Ob7Fxq8jbMq1QHGM0meZXfmY6T0pQ /WWsVYv3eWN4Ma5zRjzBE1Z6k2Ra+lOuGeO4X+FchBjp4NvccTAzBYIPMiLidKnMKTne 6ksc7PE09qfrvlOA9TDB4GFdjyRf3yqk8Ua5Dey0bvOXX9FVVRgzGGpPlBEXN6Fj9riD 0xHx5NQh3A9Gi23SRMLLE+ExJ6QZYBs9wv3TZILUWBIyHIc+yBZ6h26d5gaLZwOeo3mQ NaBg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding: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:feedback-id:dkim-signature:dkim-signature:delivered-to; bh=9vHBrTf8lGgsSEQfqUP44IaZuUJGuy0Bbpcn+bOtbIo=; fh=jJnozV7qK1Iixv1jW70n3bZAOfmTmZdHU/4Nk5DhKNw=; b=lZWbqf6FwWVRp4hJvUhBKNdBPlZCKXjIdArKW2EjH/jWX04Sj2PPiz96NSZCji8bSG M7UaXSgNJxwwP/T7XN4NFHBW6/miMGOxS8ij0rK85pciZiklwLgqzzYgQiPxSUU7Prhq Qg0uNZO1x4I9AiZC5WEuSmosgeMK+ejoVTkXhmahmUa1SDNX1+3aV9AhquAYLBba0nvo EKR5iC2yJDO5jR57KrKkRBKrvLdsQqlAN89Knm4A9EDuLAiOug3H0Iqs6/A/0uUqbZof k6bzBIvgt90wMGZDYklzAK8uJBWxMDGlW+CmnnqURptrkBYPNEOA8bHnJwFrhbUCmKSA x3Nw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@itanimul.li header.s=fm1 header.b="hW/rnqOm"; dkim=neutral (body hash did not verify) header.i=@messagingengine.com header.s=fm3 header.b=V5QelEfc; 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 X-Forwarded-Encrypted: i=0; AJvYcCUhUdzpTTw6Fj0esJcku7MP7IsKMxwoQEN8wlSiZZlVIQ5LeUzwgnTFI+OduS1x4U1saO4SqX3oG6xUOmitJixrZl2dLs/uzBLeNKTI/QCalnoe0erNd6DjGYfqx1r5Y0iLGtZgM1To9wIrWHPR3Dx1i0XI2Ruz4B3oOHdXkkQAj2L2Z3bx+rxEupemk+x//gIoFIaqzBtbmNzJrtG/JUa2Axm1noIfDRqKihfSSk36BbwmTXpH1pmGj5IH0qmWZcl0QpybBpX/EAYK3glg0HKo5pc3OGizHGq0HXxcdBkM/jDbFa1Fm4gZegbVFeyQswUKyNTGXFd3tbMRNm20ey1R6Mp85a1Jr+v+EiTbndY79UCZZzmCODexJuqHLKpruI4AwGryHdy3q6IQE/Y37teNtr4Cqij7uRF1ibkZbJ/BnGo7MaqYsB7qk0ScoUtzhYJkqu+QG03b7KQ0cJB4KOyviaR72+KyoPm0/qUyRq2yG7k6gdacV733q57UuoB61pFDHaqyLL5LwUTUbCAMqYLLZGiI0UAlNKdROT+KgYdeqSA3XrdEpRb6kZhVMuZm6WNmAkolkIuxjEFThydwe+YbseoEK9Etghqjv5oDo7Zcs/V7ASD7Pk07+gtVwI1iVNiJ4YOLyvPX+rysh1VUlDV1okTZRVcY4T+x3XcziHylj0VhMeDIICJiok3VwdHxrMbS3kuwga6mp/LBOFkYRn041EdGU07S8KnSnuZCgzmH0PMnG0xSAlMyrKykDmThM9FVHCEO20ra85EoBS1bW+dly/Ze/txLk0PRzQvZs+32YVDJevtjGbINym/O6ihkbwMKHbunznSj6F1Edm6RRu2LttRMEUQgZrWK6GCinPEa9zJaeU7RONfaTT8WfSu19fhVg4WR/aNAKB5YdppZu8zIqersvVvhxyn+sxqsdkWd4Fxki+Kj25nh9VDzUX8EcGYj73 BtmfHnaGV4N3n50qf9e8L/sY9SY2Wx9wBaB8k44LX+0+HC+KSxZbCUjOZP+ySJJQ0fOncnIQ+U7FCbSKVDht68jU1bwLnv/ucGazsFvv9n1BNGUfretliXi9Nwc7idTBG+ehsuy+Fm9uHs3qdTcGAyxMxayBUfywp7r3B4PcxJ8/87npk/nQDZbXXpJn+cOHvG6mFi0XVKCFBmSYTJU3yCFkE/FQSnu/Jz+Tud7tQnYr+WgNMLrdQKowHaBS09u3SK0KE1NFu6PeCmrOxCUzrc6+EWeqKuYcAsDGSrFkMZFitVED8ZEr4oYCekPboHGyO0EoticeX5Jv+UT9HiuxeVniDWqpH8j2E2CrwQk2wmDS9rrZo/bUk/MR8Ltc3rkOlCEsXaU94kyxfoN6NsbStEdyimbiRsotWrQxdcbXcQ0djK8IMLmuFNT5cxXRjBFgjYYFBUmwlGtxk1mAg4DDg3FJhqpKGYDG4W4DC7dIZBJzF590xDe4JzCNuLPiGqiDM9voKmqPKX5n2GY3Sm8toYGZGbDlAupaent1cNNI+yLcpn/22fOrSBmw8M/gyR+wHozoQ3hQOvyWoeYTY/Kf6coTrNUefEakwa+Gze Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a10-20020a170906244a00b00a35ddf3a7c5si2664034ejb.951.2024.02.04.01.02.59; Sun, 04 Feb 2024 01:02:59 -0800 (PST) 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; dkim=neutral (body hash did not verify) header.i=@itanimul.li header.s=fm1 header.b="hW/rnqOm"; dkim=neutral (body hash did not verify) header.i=@messagingengine.com header.s=fm3 header.b=V5QelEfc; 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 0F37268D14E; Sun, 4 Feb 2024 11:02:45 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from fout4-smtp.messagingengine.com (fout4-smtp.messagingengine.com [103.168.172.147]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BD6CA68D131 for ; Sun, 4 Feb 2024 11:02:38 +0200 (EET) Received: from compute3.internal (compute3.nyi.internal [10.202.2.43]) by mailfout.nyi.internal (Postfix) with ESMTP id 7FC821380073 for ; Sun, 4 Feb 2024 04:02:37 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute3.internal (MEProxy); Sun, 04 Feb 2024 04:02:37 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=itanimul.li; h= cc:content-transfer-encoding:content-type:date:date:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1707037357; x= 1707123757; bh=Fa9uzJxTTz4W36VpRZ+n9keHU3JsS1sz5SbBl0fCPSQ=; b=h W/rnqOmAprMI1JZpNEVWTBquHsABe+ABcL0I+PA2TX4bUyTnPna3OvMLra7lzhuH WCO19BqgVmxO9LtPkCBowtrC3ODQNr59cGUzbHr9rVFKLym6Y/W4Km7sRZyVJUDt MBxYlJTH51UWX2C3rE3syi2Jb+XENH+dqrqYpyw77C+N7mtoCplWqSSxetRe+xqH CvgIT3Xj0SLXCYxBHJ1Vy3360+AV+CXCHxRFNn67yziYBgRw2UsRV2/L0pa7QcD/ rf7/tPfmYsZeMDpJsOJflDo8eRBGpA3NlAjU6ORF8rsykAer8OQmltgss7QzpXw2 t3YTIhz7P18Ikd1vM1TPA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:content-type :date:date:feedback-id:feedback-id:from:from:in-reply-to :in-reply-to:message-id:mime-version:references:reply-to:subject :subject:to:to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender :x-sasl-enc; s=fm3; t=1707037357; x=1707123757; bh=Fa9uzJxTTz4W3 6VpRZ+n9keHU3JsS1sz5SbBl0fCPSQ=; b=V5QelEfcr38ER2dL0yB0VfKLYz8ko jjZCfsebeunMVkJNafRVtv5h/N2o4tOUGHE7ztTG50Hg+OG8zxtmjZ9kEmq8okhS RZGf11CglIcI8NwcDaUqDn8bRzpb6Mvw2JqCJL+B2AfhO9FaZYMMker0OcgVS6Dd cyT2hljR47hGlHbyXZCzXdw0g+CC9Y9tManiRNSn1euh+lQeDM0XzhNVgXFIXsRy lIRbPdptfsv2k+yr6EkC+4kht7eb2jHSx0EW+6JvF39r373bq54sxe3Mnp04EmP/ zYKPkIlS5mmRrQo9ORzdEfpCrE460Mn6E/UDVFnOculjNZnzSE7Wb8ooQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvkedrfedujedguddvjecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfgh necuuegrihhlohhuthemuceftddtnecunecujfgurhephffvufffkffojghfggfgsedtke ertdertddtnecuhfhrohhmpedflfdrucffvghkkhgvrhdfuceojhguvghksehithgrnhhi mhhulhdrlhhiqeenucggtffrrghtthgvrhhnpedvhefftefgieetudekheffleevieeive dvledutdeitdejueffgfffheefveejudenucffohhmrghinheplhhisghsughlrdhorhhg necuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepjhguvg hksehithgrnhhimhhulhdrlhhi X-ME-Proxy: Feedback-ID: i84994747:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA for ; Sun, 4 Feb 2024 04:02:36 -0500 (EST) From: "J. Dekker" To: ffmpeg-devel@ffmpeg.org Date: Sun, 4 Feb 2024 10:02:32 +0100 Message-ID: <20240204090233.1157950-2-jdek@itanimul.li> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240204090233.1157950-1-jdek@itanimul.li> References: <20240204090233.1157950-1-jdek@itanimul.li> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/2] avdevice: remove sdl2 outdev 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: zq1cJub6xRfA Signed-off-by: J. Dekker --- MAINTAINERS | 2 - configure | 3 +- doc/outdevs.texi | 66 ------- libavdevice/Makefile | 1 - libavdevice/alldevices.c | 1 - libavdevice/sdl2.c | 370 --------------------------------------- 6 files changed, 1 insertion(+), 442 deletions(-) delete mode 100644 libavdevice/sdl2.c diff --git a/MAINTAINERS b/MAINTAINERS index 4677931211..baead5d270 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -292,8 +292,6 @@ libavdevice libdc1394.c Roman Shaposhnik opengl_enc.c Lukasz Marek pulse_audio_enc.c Lukasz Marek - sdl Stefano Sabatini - sdl2.c Josh de Kock v4l2.c Giorgio Vazzana vfwcap.c Ramiro Polla xv.c Lukasz Marek diff --git a/configure b/configure index 68f675a4bc..c4eebab14f 100755 --- a/configure +++ b/configure @@ -3635,7 +3635,6 @@ oss_indev_deps_any="sys_soundcard_h" oss_outdev_deps_any="sys_soundcard_h" pulse_indev_deps="libpulse" pulse_outdev_deps="libpulse" -sdl2_outdev_deps="sdl2" sndio_indev_deps="sndio" sndio_outdev_deps="sndio" v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h" @@ -7710,7 +7709,7 @@ enabled zoompan_filter && prepend avfilter_deps "swscale" enabled lavfi_indev && prepend avdevice_deps "avfilter" #FIXME -enabled_any sdl2_outdev opengl_outdev && enabled sdl2 && +enabled_any opengl_outdev && enabled sdl2 && add_cflags $(filter_out '-Dmain=SDL_main' $sdl2_cflags) enabled opus_decoder && prepend avcodec_deps "swresample" diff --git a/doc/outdevs.texi b/doc/outdevs.texi index f0484bbf8f..d3b9199463 100644 --- a/doc/outdevs.texi +++ b/doc/outdevs.texi @@ -406,72 +406,6 @@ Play a file on default device on default server: ffmpeg -i INPUT -f pulse "stream name" @end example -@section sdl - -SDL (Simple DirectMedia Layer) output device. - -"sdl2" can be used as alias for "sdl". - -This output device allows one to show a video stream in an SDL -window. Only one SDL window is allowed per application, so you can -have only one instance of this output device in an application. - -To enable this output device you need libsdl installed on your system -when configuring your build. - -For more information about SDL, check: -@url{http://www.libsdl.org/} - -@subsection Options - -@table @option - -@item window_borderless -Set SDL window border off. -Default value is 0 (enable window border). - -@item window_enable_quit -Enable quit action (using window button or keyboard key) -when non-zero value is provided. -Default value is 1 (enable quit action). - -@item window_fullscreen -Set fullscreen mode when non-zero value is provided. -Default value is zero. - -@item window_size -Set the SDL window size, can be a string of the form -@var{width}x@var{height} or a video size abbreviation. -If not specified it defaults to the size of the input video, -downscaled according to the aspect ratio. - -@item window_title -Set the SDL window title, if not specified default to the filename -specified for the output device. - -@item window_x -@item window_y -Set the position of the window on the screen. -@end table - -@subsection Interactive commands - -The window created by the device can be controlled through the -following interactive commands. - -@table @key -@item q, ESC -Quit the device immediately. -@end table - -@subsection Examples - -The following command shows the @command{ffmpeg} output is an -SDL window, forcing its size to the qcif format: -@example -ffmpeg -i INPUT -c:v rawvideo -pix_fmt yuv420p -window_size qcif -f sdl "SDL output" -@end example - @section sndio sndio audio output device. diff --git a/libavdevice/Makefile b/libavdevice/Makefile index c30449201d..26b2339ae1 100644 --- a/libavdevice/Makefile +++ b/libavdevice/Makefile @@ -42,7 +42,6 @@ OBJS-$(CONFIG_PULSE_INDEV) += pulse_audio_dec.o \ pulse_audio_common.o timefilter.o OBJS-$(CONFIG_PULSE_OUTDEV) += pulse_audio_enc.o \ pulse_audio_common.o -OBJS-$(CONFIG_SDL2_OUTDEV) += sdl2.o OBJS-$(CONFIG_SNDIO_INDEV) += sndio_dec.o sndio.o OBJS-$(CONFIG_SNDIO_OUTDEV) += sndio_enc.o sndio.o OBJS-$(CONFIG_V4L2_INDEV) += v4l2.o v4l2-common.o timefilter.o diff --git a/libavdevice/alldevices.c b/libavdevice/alldevices.c index 8a90fcb5d7..9215be7214 100644 --- a/libavdevice/alldevices.c +++ b/libavdevice/alldevices.c @@ -46,7 +46,6 @@ extern const AVInputFormat ff_oss_demuxer; extern const FFOutputFormat ff_oss_muxer; extern const AVInputFormat ff_pulse_demuxer; extern const FFOutputFormat ff_pulse_muxer; -extern const FFOutputFormat ff_sdl2_muxer; extern const AVInputFormat ff_sndio_demuxer; extern const FFOutputFormat ff_sndio_muxer; extern const AVInputFormat ff_v4l2_demuxer; diff --git a/libavdevice/sdl2.c b/libavdevice/sdl2.c deleted file mode 100644 index 342a253dc0..0000000000 --- a/libavdevice/sdl2.c +++ /dev/null @@ -1,370 +0,0 @@ -/* - * Copyright (c) 2016 Josh de Kock - * - * This file is part of FFmpeg. - * - * FFmpeg is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * FFmpeg is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/** - * @file - * libSDL2 output device - */ - -#include -#include - -#include "libavutil/avstring.h" -#include "libavutil/imgutils.h" -#include "libavutil/opt.h" -#include "libavutil/parseutils.h" -#include "libavutil/pixdesc.h" -#include "libavutil/time.h" -#include "avdevice.h" -#include "libavformat/mux.h" - -typedef struct { - AVClass *class; - SDL_Window *window; - SDL_Renderer *renderer; - char *window_title; - int window_width, window_height; /**< size of the window */ - int window_x, window_y; /**< position of the window */ - int window_fullscreen; - int window_borderless; - int enable_quit_action; - - SDL_Texture *texture; - int texture_fmt; - SDL_Rect texture_rect; - - int inited; -} SDLContext; - -static const struct sdl_texture_format_entry { - enum AVPixelFormat format; int texture_fmt; -} sdl_texture_format_map[] = { - /* - * Not implemented in FFmpeg, but leaving here for completeness. - * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_ARGB4444 }, - * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_RGBA4444 }, - * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_ABGR4444 }, - * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_BGRA4444 }, - * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_ARGB1555 }, - * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_RGBA5551 }, - * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_ABGR1555 }, - * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_BGRA5551 }, - * { AV_PIX_FMT_NONE, SDL_PIXELFORMAT_ARGB2101010 }, - */ - { AV_PIX_FMT_RGB8, SDL_PIXELFORMAT_RGB332 }, - { AV_PIX_FMT_RGB444, SDL_PIXELFORMAT_RGB444 }, - { AV_PIX_FMT_RGB555, SDL_PIXELFORMAT_RGB555 }, - { AV_PIX_FMT_BGR555, SDL_PIXELFORMAT_BGR555 }, - { AV_PIX_FMT_RGB565, SDL_PIXELFORMAT_RGB565 }, - { AV_PIX_FMT_BGR565, SDL_PIXELFORMAT_BGR565 }, - { AV_PIX_FMT_RGB24, SDL_PIXELFORMAT_RGB24 }, - { AV_PIX_FMT_BGR24, SDL_PIXELFORMAT_BGR24 }, - { AV_PIX_FMT_0RGB32, SDL_PIXELFORMAT_RGB888 }, - { AV_PIX_FMT_0BGR32, SDL_PIXELFORMAT_BGR888 }, -#if HAVE_BIGENDIAN - { AV_PIX_FMT_RGB0, SDL_PIXELFORMAT_RGBX8888 }, - { AV_PIX_FMT_BGR0, SDL_PIXELFORMAT_BGRX8888 }, -#else - { AV_PIX_FMT_0BGR, SDL_PIXELFORMAT_RGBX8888 }, - { AV_PIX_FMT_0RGB, SDL_PIXELFORMAT_BGRX8888 }, -#endif - { AV_PIX_FMT_RGB32, SDL_PIXELFORMAT_ARGB8888 }, - { AV_PIX_FMT_RGB32_1, SDL_PIXELFORMAT_RGBA8888 }, - { AV_PIX_FMT_BGR32, SDL_PIXELFORMAT_ABGR8888 }, - { AV_PIX_FMT_BGR32_1, SDL_PIXELFORMAT_BGRA8888 }, - { AV_PIX_FMT_YUV420P, SDL_PIXELFORMAT_IYUV }, - { AV_PIX_FMT_YUYV422, SDL_PIXELFORMAT_YUY2 }, - { AV_PIX_FMT_UYVY422, SDL_PIXELFORMAT_UYVY }, - { AV_PIX_FMT_NONE, 0 }, -}; - -static void compute_texture_rect(AVFormatContext *s) -{ - AVRational sar, dar; /* sample and display aspect ratios */ - SDLContext *sdl = s->priv_data; - AVStream *st = s->streams[0]; - AVCodecParameters *codecpar = st->codecpar; - SDL_Rect *texture_rect = &sdl->texture_rect; - - /* compute texture width and height from the codec context information */ - sar = st->sample_aspect_ratio.num ? st->sample_aspect_ratio : (AVRational){ 1, 1 }; - dar = av_mul_q(sar, (AVRational){ codecpar->width, codecpar->height }); - - /* we suppose the screen has a 1/1 sample aspect ratio */ - if (sdl->window_width && sdl->window_height) { - /* fit in the window */ - if (av_cmp_q(dar, (AVRational){ sdl->window_width, sdl->window_height }) > 0) { - /* fit in width */ - texture_rect->w = sdl->window_width; - texture_rect->h = av_rescale(texture_rect->w, dar.den, dar.num); - } else { - /* fit in height */ - texture_rect->h = sdl->window_height; - texture_rect->w = av_rescale(texture_rect->h, dar.num, dar.den); - } - } else { - if (sar.num > sar.den) { - texture_rect->w = codecpar->width; - texture_rect->h = av_rescale(texture_rect->w, dar.den, dar.num); - } else { - texture_rect->h = codecpar->height; - texture_rect->w = av_rescale(texture_rect->h, dar.num, dar.den); - } - sdl->window_width = texture_rect->w; - sdl->window_height = texture_rect->h; - } - - texture_rect->x = (sdl->window_width - texture_rect->w) / 2; - texture_rect->y = (sdl->window_height - texture_rect->h) / 2; -} - -static int sdl2_write_trailer(AVFormatContext *s) -{ - SDLContext *sdl = s->priv_data; - - if (sdl->texture) - SDL_DestroyTexture(sdl->texture); - sdl->texture = NULL; - - if (sdl->renderer) - SDL_DestroyRenderer(sdl->renderer); - sdl->renderer = NULL; - - if (sdl->window) - SDL_DestroyWindow(sdl->window); - sdl->window = NULL; - - if (!sdl->inited) - SDL_Quit(); - - return 0; -} - -static int sdl2_write_header(AVFormatContext *s) -{ - SDLContext *sdl = s->priv_data; - AVStream *st = s->streams[0]; - AVCodecParameters *codecpar = st->codecpar; - int i, ret = 0; - int flags = 0; - - if (!sdl->window_title) - sdl->window_title = av_strdup(s->url); - - if (SDL_WasInit(SDL_INIT_VIDEO)) { - av_log(s, AV_LOG_WARNING, - "SDL video subsystem was already inited, you could have multiple SDL outputs. This may cause unknown behaviour.\n"); - sdl->inited = 1; - } - - if ( s->nb_streams > 1 - || codecpar->codec_type != AVMEDIA_TYPE_VIDEO - || codecpar->codec_id != AV_CODEC_ID_RAWVIDEO) { - av_log(s, AV_LOG_ERROR, "Only supports one rawvideo stream\n"); - goto fail; - } - - for (i = 0; sdl_texture_format_map[i].format != AV_PIX_FMT_NONE; i++) { - if (sdl_texture_format_map[i].format == codecpar->format) { - sdl->texture_fmt = sdl_texture_format_map[i].texture_fmt; - break; - } - } - - if (!sdl->texture_fmt) { - av_log(s, AV_LOG_ERROR, - "Unsupported pixel format '%s'.\n", - av_get_pix_fmt_name(codecpar->format)); - goto fail; - } - - /* resize texture to width and height from the codec context information */ - flags = SDL_WINDOW_HIDDEN | - (sdl->window_fullscreen ? SDL_WINDOW_FULLSCREEN : 0) | - (sdl->window_borderless ? SDL_WINDOW_BORDERLESS : SDL_WINDOW_RESIZABLE); - - /* initialization */ - if (!sdl->inited){ - if (SDL_Init(SDL_INIT_VIDEO) != 0) { - av_log(s, AV_LOG_ERROR, "Unable to initialize SDL: %s\n", SDL_GetError()); - goto fail; - } - } - - compute_texture_rect(s); - - if (SDL_CreateWindowAndRenderer(sdl->window_width, sdl->window_height, - flags, &sdl->window, &sdl->renderer) != 0){ - av_log(sdl, AV_LOG_ERROR, "Couldn't create window and renderer: %s\n", SDL_GetError()); - goto fail; - } - - SDL_SetWindowTitle(sdl->window, sdl->window_title); - SDL_SetWindowPosition(sdl->window, sdl->window_x, sdl->window_y); - SDL_ShowWindow(sdl->window); - - sdl->texture = SDL_CreateTexture(sdl->renderer, sdl->texture_fmt, SDL_TEXTUREACCESS_STREAMING, - codecpar->width, codecpar->height); - - if (!sdl->texture) { - av_log(sdl, AV_LOG_ERROR, "Unable to set create mode: %s\n", SDL_GetError()); - goto fail; - } - - av_log(s, AV_LOG_VERBOSE, "w:%d h:%d fmt:%s -> w:%d h:%d\n", - codecpar->width, codecpar->height, av_get_pix_fmt_name(codecpar->format), - sdl->window_width, sdl->window_height); - - sdl->inited = 1; - - return 0; -fail: - sdl2_write_trailer(s); - return ret; -} - -static int sdl2_write_packet(AVFormatContext *s, AVPacket *pkt) -{ - int ret, quit = 0; - SDLContext *sdl = s->priv_data; - AVCodecParameters *codecpar = s->streams[0]->codecpar; - uint8_t *data[4]; - int linesize[4]; - - SDL_Event event; - if (SDL_PollEvent(&event)){ - switch (event.type) { - case SDL_KEYDOWN: - switch (event.key.keysym.sym) { - case SDLK_ESCAPE: - case SDLK_q: - quit = 1; - break; - default: - break; - } - break; - case SDL_QUIT: - quit = 1; - break; - case SDL_WINDOWEVENT: - switch(event.window.event){ - case SDL_WINDOWEVENT_RESIZED: - case SDL_WINDOWEVENT_SIZE_CHANGED: - sdl->window_width = event.window.data1; - sdl->window_height = event.window.data2; - compute_texture_rect(s); - break; - default: - break; - } - break; - default: - break; - } - } - - if (quit && sdl->enable_quit_action) { - sdl2_write_trailer(s); - return AVERROR(EIO); - } - - av_image_fill_arrays(data, linesize, pkt->data, codecpar->format, codecpar->width, codecpar->height, 1); - switch (sdl->texture_fmt) { - /* case SDL_PIXELFORMAT_ARGB4444: - * case SDL_PIXELFORMAT_RGBA4444: - * case SDL_PIXELFORMAT_ABGR4444: - * case SDL_PIXELFORMAT_BGRA4444: - * case SDL_PIXELFORMAT_ARGB1555: - * case SDL_PIXELFORMAT_RGBA5551: - * case SDL_PIXELFORMAT_ABGR1555: - * case SDL_PIXELFORMAT_BGRA5551: - * case SDL_PIXELFORMAT_ARGB2101010: - */ - case SDL_PIXELFORMAT_IYUV: - case SDL_PIXELFORMAT_YUY2: - case SDL_PIXELFORMAT_UYVY: - ret = SDL_UpdateYUVTexture(sdl->texture, NULL, - data[0], linesize[0], - data[1], linesize[1], - data[2], linesize[2]); - break; - case SDL_PIXELFORMAT_RGB332: - case SDL_PIXELFORMAT_RGB444: - case SDL_PIXELFORMAT_RGB555: - case SDL_PIXELFORMAT_BGR555: - case SDL_PIXELFORMAT_RGB565: - case SDL_PIXELFORMAT_BGR565: - case SDL_PIXELFORMAT_RGB24: - case SDL_PIXELFORMAT_BGR24: - case SDL_PIXELFORMAT_RGB888: - case SDL_PIXELFORMAT_RGBX8888: - case SDL_PIXELFORMAT_BGR888: - case SDL_PIXELFORMAT_BGRX8888: - case SDL_PIXELFORMAT_ARGB8888: - case SDL_PIXELFORMAT_RGBA8888: - case SDL_PIXELFORMAT_ABGR8888: - case SDL_PIXELFORMAT_BGRA8888: - ret = SDL_UpdateTexture(sdl->texture, NULL, data[0], linesize[0]); - break; - default: - av_log(NULL, AV_LOG_FATAL, "Unsupported pixel format\n"); - ret = -1; - break; - } - SDL_RenderClear(sdl->renderer); - SDL_RenderCopy(sdl->renderer, sdl->texture, NULL, &sdl->texture_rect); - SDL_RenderPresent(sdl->renderer); - return ret; -} - -#define OFFSET(x) offsetof(SDLContext,x) - -static const AVOption options[] = { - { "window_title", "set SDL window title", OFFSET(window_title), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, AV_OPT_FLAG_ENCODING_PARAM }, - { "window_size", "set SDL window forced size", OFFSET(window_width), AV_OPT_TYPE_IMAGE_SIZE, { .str = NULL }, 0, 0, AV_OPT_FLAG_ENCODING_PARAM }, - { "window_x", "set SDL window x position", OFFSET(window_x), AV_OPT_TYPE_INT, { .i64 = SDL_WINDOWPOS_CENTERED }, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, - { "window_y", "set SDL window y position", OFFSET(window_y), AV_OPT_TYPE_INT, { .i64 = SDL_WINDOWPOS_CENTERED }, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, - { "window_fullscreen", "set SDL window fullscreen", OFFSET(window_fullscreen), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM }, - { "window_borderless", "set SDL window border off", OFFSET(window_borderless), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, AV_OPT_FLAG_ENCODING_PARAM }, - { "window_enable_quit", "set if quit action is available", OFFSET(enable_quit_action), AV_OPT_TYPE_INT, {.i64=1}, 0, 1, AV_OPT_FLAG_ENCODING_PARAM }, - { NULL }, -}; - -static const AVClass sdl2_class = { - .class_name = "sdl2 outdev", - .item_name = av_default_item_name, - .option = options, - .version = LIBAVUTIL_VERSION_INT, - .category = AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT, -}; - -const FFOutputFormat ff_sdl2_muxer = { - .p.name = "sdl,sdl2", - .p.long_name = NULL_IF_CONFIG_SMALL("SDL2 output device"), - .priv_data_size = sizeof(SDLContext), - .p.audio_codec = AV_CODEC_ID_NONE, - .p.video_codec = AV_CODEC_ID_RAWVIDEO, - .write_header = sdl2_write_header, - .write_packet = sdl2_write_packet, - .write_trailer = sdl2_write_trailer, - .p.flags = AVFMT_NOFILE | AVFMT_VARIABLE_FPS | AVFMT_NOTIMESTAMPS, - .p.priv_class = &sdl2_class, -};