diff --git a/configure.ac b/configure.ac index 329150a61..e139e5bd2 100644 --- a/configure.ac +++ b/configure.ac @@ -1497,7 +1497,7 @@ if test $blank_req != no; then then CFLAGS="$CFLAGS ${BLANK_CFLAGS}" CXXFLAGS="$CXXFLAGS ${BLANK_CFLAGS}" - BLANK_OBJ="src/capture_filter/blank.o src/libavcodec/lavc_common.o" # get_ug_to_av_pixfmt() + BLANK_OBJ="src/capture_filter/blank.o src/libavcodec/utils.o" # get_ug_to_av_pixfmt() ADD_MODULE("vcapfilter_blank", "$BLANK_OBJ", "$BLANK_LIBS") blank=yes fi @@ -1712,7 +1712,7 @@ fi if test $libavcodec_req != no -a $found_libavcodec = yes -a $found_libavutil = yes then - LIBAVCODEC_COMMON="src/libavcodec/lavc_common.o" + LIBAVCODEC_COMMON="src/libavcodec/lavc_common.o src/libavcodec/utils.o" LIBAVCODEC_VIDEO="src/libavcodec/lavc_video.o src/libavcodec/from_lavc_vid_conv.o src/libavcodec/to_lavc_vid_conv.o" AC_DEFINE([HAVE_LAVC], [1], [Build with LAVC support]) if test $lavc_hwacc_vdpau = yes; then diff --git a/src/capture_filter/blank.c b/src/capture_filter/blank.c index 8e75e6840..4100ee697 100644 --- a/src/capture_filter/blank.c +++ b/src/capture_filter/blank.c @@ -42,8 +42,8 @@ #endif /* HAVE_CONFIG_H */ #include "capture_filter.h" -#include "libavcodec/lavc_common.h" #include "lib_common.h" +#include "libavcodec/utils.h" #include "messaging.h" #include "module.h" diff --git a/src/libavcodec/lavc_common.c b/src/libavcodec/lavc_common.c index d68fe9c9b..3cd0c0f9a 100644 --- a/src/libavcodec/lavc_common.c +++ b/src/libavcodec/lavc_common.c @@ -99,61 +99,6 @@ enum AVCodecID get_ug_to_av_codec(codec_t ug_codec) return AV_CODEC_ID_NONE; } -/// known UG<->AV pixfmt conversions, terminate with NULL (returned by -/// get_av_to_ug_pixfmts()) -static const struct uv_to_av_pixfmt uv_to_av_pixfmts[] = { - {RGBA, AV_PIX_FMT_RGBA}, - {UYVY, AV_PIX_FMT_UYVY422}, - {YUYV,AV_PIX_FMT_YUYV422}, - //R10k, - //v210, - //DVS10, - //DXT1, - //DXT1_YUV, - //DXT5, - {RGB, AV_PIX_FMT_RGB24}, - // DPX10, - //JPEG, - //RAW, - //H264, - //MJPG, - //VP8, - {BGR, AV_PIX_FMT_BGR24}, - //J2K, - {I420, AV_PIX_FMT_YUVJ420P}, - {RG48, AV_PIX_FMT_RGB48LE}, -#if XV3X_PRESENT - {Y416, AV_PIX_FMT_XV36}, -#endif - {0, 0} -}; - -codec_t get_av_to_ug_pixfmt(enum AVPixelFormat av_pixfmt) { - for (unsigned int i = 0; uv_to_av_pixfmts[i].uv_codec != VIDEO_CODEC_NONE; ++i) { - if (uv_to_av_pixfmts[i].av_pixfmt == av_pixfmt) { - return uv_to_av_pixfmts[i].uv_codec; - } - } - return VIDEO_CODEC_NONE; -} - -enum AVPixelFormat get_ug_to_av_pixfmt(codec_t ug_codec) { - for (unsigned int i = 0; uv_to_av_pixfmts[i].uv_codec != VIDEO_CODEC_NONE; ++i) { - if (uv_to_av_pixfmts[i].uv_codec == ug_codec) { - return uv_to_av_pixfmts[i].av_pixfmt; - } - } - return AV_PIX_FMT_NONE; -} - -/** - * Returns list all known FFMPEG to UG pixfmt conversions. Terminated with NULL - * element. - */ -const struct uv_to_av_pixfmt *get_av_to_ug_pixfmts() { - return uv_to_av_pixfmts; -} - // // utility functions // diff --git a/src/libavcodec/lavc_common.h b/src/libavcodec/lavc_common.h index ce3040986..9289f2081 100644 --- a/src/libavcodec/lavc_common.h +++ b/src/libavcodec/lavc_common.h @@ -55,6 +55,8 @@ extern "C" { } #endif +#include "libavcodec/utils.h" + // component indices to rgb_shift[] (@ref av_to_uv_convert) #define R 0 #define G 1 @@ -178,13 +180,6 @@ bool libav_codec_has_extradata(codec_t codec); codec_t get_av_to_ug_codec(enum AVCodecID av_codec); enum AVCodecID get_ug_to_av_codec(codec_t ug_codec); -struct uv_to_av_pixfmt { - codec_t uv_codec; - enum AVPixelFormat av_pixfmt; -}; -codec_t get_av_to_ug_pixfmt(enum AVPixelFormat av_pixfmt) __attribute__((const)); -enum AVPixelFormat get_ug_to_av_pixfmt(codec_t ug_codec) __attribute__((const)); -const struct uv_to_av_pixfmt *get_av_to_ug_pixfmts(void) __attribute__((const)); void ug_set_av_logging(void); int av_pixfmt_get_subsampling(enum AVPixelFormat fmt) __attribute__((const)); struct pixfmt_desc av_pixfmt_get_desc(enum AVPixelFormat pixfmt); diff --git a/src/libavcodec/utils.c b/src/libavcodec/utils.c new file mode 100644 index 000000000..5a749db0f --- /dev/null +++ b/src/libavcodec/utils.c @@ -0,0 +1,102 @@ +/** + * @file libavcodec/utils.c + * @author Martin Pulec + * @author Martin Piatka <445597@mail.muni.cz> + */ +/* + * Copyright (c) 2013-2023 CESNET, z. s. p. o. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, is permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of CESNET nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#include "config_unix.h" +#include "config_win32.h" +#endif // HAVE_CONFIG_H + +#include "libavcodec/utils.h" + +/// known UG<->AV pixfmt conversions, terminate with NULL (returned by +/// get_av_to_ug_pixfmts()) +static const struct uv_to_av_pixfmt uv_to_av_pixfmts[] = { + {RGBA, AV_PIX_FMT_RGBA}, + {UYVY, AV_PIX_FMT_UYVY422}, + {YUYV,AV_PIX_FMT_YUYV422}, + //R10k, + //v210, + //DVS10, + //DXT1, + //DXT1_YUV, + //DXT5, + {RGB, AV_PIX_FMT_RGB24}, + // DPX10, + //JPEG, + //RAW, + //H264, + //MJPG, + //VP8, + {BGR, AV_PIX_FMT_BGR24}, + //J2K, + {I420, AV_PIX_FMT_YUVJ420P}, + {RG48, AV_PIX_FMT_RGB48LE}, +#if XV3X_PRESENT + {Y416, AV_PIX_FMT_XV36}, +#endif + {0, 0} +}; + +codec_t get_av_to_ug_pixfmt(enum AVPixelFormat av_pixfmt) { + for (unsigned int i = 0; uv_to_av_pixfmts[i].uv_codec != VIDEO_CODEC_NONE; ++i) { + if (uv_to_av_pixfmts[i].av_pixfmt == av_pixfmt) { + return uv_to_av_pixfmts[i].uv_codec; + } + } + return VIDEO_CODEC_NONE; +} + +enum AVPixelFormat get_ug_to_av_pixfmt(codec_t ug_codec) { + for (unsigned int i = 0; uv_to_av_pixfmts[i].uv_codec != VIDEO_CODEC_NONE; ++i) { + if (uv_to_av_pixfmts[i].uv_codec == ug_codec) { + return uv_to_av_pixfmts[i].av_pixfmt; + } + } + return AV_PIX_FMT_NONE; +} + +/** + * Returns list all known FFMPEG to UG pixfmt conversions. Terminated with NULL + * element. + */ +const struct uv_to_av_pixfmt *get_av_to_ug_pixfmts() { + return uv_to_av_pixfmts; +} + +/* vi: set expandtab sw=8: */ diff --git a/src/libavcodec/utils.h b/src/libavcodec/utils.h new file mode 100644 index 000000000..c68a733b2 --- /dev/null +++ b/src/libavcodec/utils.h @@ -0,0 +1,61 @@ +/** + * @file libavcodec/utils.h + * @author Martin Pulec + */ +/* + * Copyright (c) 2013-2023 CESNET, z. s. p. o. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, is permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of CESNET nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef LIBAVCODEC_UTILS_H_184d6a99_7712_4002_9938_502CC8A4E9FE +#define LIBAVCODEC_UTILS_H_184d6a99_7712_4002_9938_502CC8A4E9FE + +#include + +#include "types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct uv_to_av_pixfmt { + codec_t uv_codec; + enum AVPixelFormat av_pixfmt; +}; +codec_t get_av_to_ug_pixfmt(enum AVPixelFormat av_pixfmt) __attribute__((const)); +enum AVPixelFormat get_ug_to_av_pixfmt(codec_t ug_codec) __attribute__((const)); +const struct uv_to_av_pixfmt *get_av_to_ug_pixfmts(void) __attribute__((const)); + +#ifdef __cplusplus +} +#endif + +#endif // defined LIBAVCODEC_UTILS_H_184d6a99_7712_4002_9938_502CC8A4E9FE +