Steve Lhomme pushed to branch master at VideoLAN / VLC
Commits:
5e27609f by Nicolas Chauvet at 2026-01-29T18:17:12+00:00
contrib: enable dirac decoder via libavcodec
- - - - -
d3d6cc4b by Nicolas Chauvet at 2026-01-29T18:17:12+00:00
package: remove schroedinger
- - - - -
f98fd8fd by Nicolas Chauvet at 2026-01-29T18:17:12+00:00
codec: remove schroedinger
The libschroediner library is unmaintainted and project vanished.
VLC can use libavcodec for dirac instead.
- - - - -
a9c9e8b6 by Nicolas Chauvet at 2026-01-29T18:17:12+00:00
contrib: remove schroedinger
Also remove ORC, only used by libschroedinger.
- - - - -
90c559ef by Nicolas Chauvet at 2026-01-29T18:17:12+00:00
macosx: drop Dirac video codec
This will drop Dirac from encoder profile
- - - - -
0ac6fb36 by Nicolas Chauvet at 2026-01-29T18:17:12+00:00
sout: remove dirac to ogg video codec in encoder
- - - - -
65e744b0 by Nicolas Chauvet at 2026-01-29T18:17:12+00:00
NEWS: Remove schroedinger support for dirac in favor of avcodec
- - - - -
22 changed files:
- NEWS
- configure.ac
- contrib/src/ffmpeg/rules.mak
- − contrib/src/orc/SHA512SUMS
- − contrib/src/orc/rules.mak
- − contrib/src/schroedinger/SHA512SUMS
- − contrib/src/schroedinger/rules.mak
- − contrib/src/schroedinger/schroedinger-disable-orcc.patch
- − contrib/src/schroedinger/schroedinger-notests.patch
- extras/package/apple/build.conf
- extras/package/raspberry/configure.sh
- extras/package/wasm-emscripten/build.sh
- extras/package/win32/build.sh
- extras/package/win32/configure.sh
- meson_options.txt
- modules/codec/Makefile.am
- modules/codec/meson.build
- − modules/codec/schroedinger.c
- modules/gui/macosx/windows/convertandsave/VLCConvertAndSaveWindowController.m
- modules/stream_out/record.c
- po/POTFILES.in
- po/vlc.pot
Changes:
=====================================
NEWS
=====================================
@@ -49,6 +49,7 @@ Demuxer:
* Support for DMX audio music (MUS) files
Codecs:
+ * Remove schroedinger support for dirac in favor of avcodec
* Support for experimental AV1 video encoding
* WebVTT encoder
* Remove iomx support for Android
=====================================
configure.ac
=====================================
@@ -3011,11 +3011,6 @@ dnl Daala decoder plugin
dnl
PKG_ENABLE_MODULES_VLC([DAALA], [], [daaladec daalaenc], [experimental daala
codec], [disabled])
-dnl
-dnl schroedinger decoder plugin (for dirac format video)
-dnl
-PKG_ENABLE_MODULES_VLC([SCHROEDINGER], [], [schroedinger-1.0 >= 1.0.10],
[dirac decoder and encoder using schroedinger], [auto])
-
dnl
dnl OpenAPV decoder plugin
dnl
=====================================
contrib/src/ffmpeg/rules.mak
=====================================
@@ -145,7 +145,7 @@ ifdef HAVE_IOS
FFMPEGCONF += --enable-pic --extra-ldflags="$(EXTRA_CFLAGS) -isysroot
$(IOS_SDK)"
ifdef HAVE_WATCHOS
FFMPEGCONF += --disable-everything
-FFMPEGCONF +=
--enable-decoder='aac,aac_latm,aac_fixed,aadec,ac3,adpcm_*,aiff,alac,alsdec,amrnb,amrwb,ape,atrac1,atrac3,atrac3plus,atrac9,binkaudio_dct,binkaudio_rdft,bmv_audio,cook,dca,derf,dpcm,dts,dvaudio,eaac,eac3,flac,flv,g722,g723,g726,g729,gsm,metasound,mpc7,mpc8,mpegaudiodec_fixed,mp3,m4a,nellymoser,opus,pcm_*,qdmc,qdm2,ra144,ra288,ralf,rka,shorten,tta,tak,truespeech,vorbis,wavpack,wma,wmalossless,wmapro,wmavoice'
+FFMPEGCONF +=
--enable-decoder='aac,aac_latm,aac_fixed,aadec,ac3,adpcm_*,aiff,alac,alsdec,amrnb,amrwb,ape,atrac1,atrac3,atrac3plus,atrac9,binkaudio_dct,binkaudio_rdft,bmv_audio,cook,dca,derf,dirac,dpcm,dts,dvaudio,eaac,eac3,flac,flv,g722,g723,g726,g729,gsm,metasound,mpc7,mpc8,mpegaudiodec_fixed,mp3,m4a,nellymoser,opus,pcm_*,qdmc,qdm2,ra144,ra288,ralf,rka,shorten,tta,tak,truespeech,vorbis,wavpack,wma,wmalossless,wmapro,wmavoice'
FFMPEGCONF +=
--enable-parser='aac,aac_latm,ac3,adpcm,amr,aac_latm,ape,cook,dca,dvaudio,flac,g723,g729,gsm,mlp,mpegaudio,opus,sipr,vorbis,xma'
FFMPEGCONF +=
--enable-demuxer='aac,ac3,adts,aiff,ape,asf,au,avi,caf,daud,dirac,dts,dv,ea,flac,flv,gsm,ivf,matroska,mmf,mov,mp3,mpeg,ogg,pcm,rm,sbc,sdp,shorten,voc,w64,wav,wv'
FFMPEGCONF += --enable-swresample
=====================================
contrib/src/orc/SHA512SUMS deleted
=====================================
@@ -1 +0,0 @@
-ba832f9ded503162931c6934b2c93727d2795f31d7de4871607ce44d70ccb5a5f1452b486fda3d33722b4ca0f137809b3c3a3e561bbaae64f94c9021e52cf2c8
orc-0.4.40.tar.bz2
=====================================
contrib/src/orc/rules.mak deleted
=====================================
@@ -1,25 +0,0 @@
-# orc
-
-ORC_VERSION := 0.4.40
-ORC_URL :=
https://gitlab.freedesktop.org/gstreamer/orc/-/archive/$(ORC_VERSION)/orc-$(ORC_VERSION).tar.bz2
-
-ifeq ($(call need_pkg,"orc-0.4"),)
-PKGS_FOUND += orc
-endif
-
-$(TARBALLS)/orc-$(ORC_VERSION).tar.bz2:
- $(call download_pkg,$(ORC_URL),orc)
-
-.sum-orc: orc-$(ORC_VERSION).tar.bz2
-
-orc: orc-$(ORC_VERSION).tar.bz2 .sum-orc
- $(UNPACK)
- $(MOVE)
-
-ORC_CONF := -Dauto_features=disabled
-
-.orc: orc crossfile.meson
- $(MESONCLEAN)
- $(MESON) $(ORC_CONF)
- +$(MESONBUILD)
- touch $@
=====================================
contrib/src/schroedinger/SHA512SUMS deleted
=====================================
@@ -1 +0,0 @@
-a39dd5360eb87a63379de71d91f48cde309ded91632c0ab8b1dc76b73591f7d0dfa7003c606d1b546d495b18c916aae905a9540b48dff7cbeb5b289e0f880438
schroedinger-1.0.11.tar.gz
=====================================
contrib/src/schroedinger/rules.mak deleted
=====================================
@@ -1,35 +0,0 @@
-# schroedinger
-
-SCHROEDINGER_VERSION := 1.0.11
-SCHROEDINGER_URL :=
$(CONTRIB_VIDEOLAN)/schroedinger/schroedinger-$(SCHROEDINGER_VERSION).tar.gz
-
-PKGS += schroedinger
-ifeq ($(call need_pkg,"schroedinger-1.0"),)
-PKGS_FOUND += schroedinger
-endif
-
-$(TARBALLS)/schroedinger-$(SCHROEDINGER_VERSION).tar.gz:
- $(call download,$(SCHROEDINGER_URL),schroedinger)
-
-.sum-schroedinger: schroedinger-$(SCHROEDINGER_VERSION).tar.gz
-
-schroedinger: schroedinger-$(SCHROEDINGER_VERSION).tar.gz .sum-schroedinger
- $(UNPACK)
- # $(call update_autoconfig,.)
- $(APPLY) $(SRC)/schroedinger/schroedinger-notests.patch
- # disable orc compilation, the old compiler matches what was used to
precompile
- $(APPLY) $(SRC)/schroedinger/schroedinger-disable-orcc.patch
- $(call pkg_static,"schroedinger.pc.in")
- $(MOVE)
-
-DEPS_schroedinger = orc $(DEPS_orc)
-
-SCHRODINGER_CONF := --with-thread=none --disable-gtk-doc
-
-.schroedinger: schroedinger
- $(RECONF)
- $(MAKEBUILDDIR)
- $(MAKECONFIGURE) $(SCHRODINGER_CONF)
- +$(MAKEBUILD)
- +$(MAKEBUILD) install
- touch $@
=====================================
contrib/src/schroedinger/schroedinger-disable-orcc.patch deleted
=====================================
@@ -1,11 +0,0 @@
---- schroedinger/configure.ac.orig 2024-05-24 11:11:32.059775800 +0200
-+++ schroedinger/configure.ac 2024-05-24 11:11:46.999404400 +0200
-@@ -56,7 +56,7 @@ fi
- SCHRO_PKG_DEPS="$SCHRO_PKG_DEPS orc-0.4 >= $ORC_VER"
- ORCC=`$PKG_CONFIG --variable=orcc orc-0.4`
- AC_SUBST(ORCC)
--AM_CONDITIONAL(HAVE_ORCC, test "x$cross_compiling" != xyes)
-+AM_CONDITIONAL(HAVE_ORCC, test "x$cross_compiling" = none)
-
- AC_ARG_WITH([thread],
- AS_HELP_STRING([--with-thread=IMPL],[use threading library
{auto,pthread,gthread,win32,none} [[default=auto]]]),
=====================================
contrib/src/schroedinger/schroedinger-notests.patch deleted
=====================================
@@ -1,21 +0,0 @@
---- schroedinger/Makefile.am 2009-09-29 07:08:51.000000000 +0200
-+++ schroedinger.new/Makefile.am 2010-01-09 02:18:41.000000000 +0100
-@@ -1,6 +1,6 @@
- AUTOMAKE_OPTIONS = foreign
-
--SUBDIRS = schroedinger doc tools testsuite
-+SUBDIRS = schroedinger doc tools
-
- DISTCHECK_CONFIGURE_FLAGS=--enable-gtk-doc
-
---- schroedinger/tools/Makefile.am 2010-01-04 03:52:01.000000000 +0100
-+++ schroedinger.new/tools/Makefile.am 2010-05-08 20:50:30.000000000 +0200
-@@ -5,7 +5,7 @@
-
-
- AM_CFLAGS = $(SCHRO_CFLAGS) $(ERROR_CFLAGS) \
-- $(ORC_CFLAGS) \
-+ -L$(prefix)/lib $(ORC_CFLAGS) \
- -DSCHRO_ENABLE_UNSTABLE_API
- LDADD = $(SCHRO_LIBS)
-
=====================================
extras/package/apple/build.conf
=====================================
@@ -49,8 +49,6 @@ export VLC_CONTRIB_OPTIONS_BASE=(
--disable-samplerate
--disable-goom
--disable-vncserver
- --disable-orc
- --disable-schroedinger
--disable-chromaprint
--disable-mad
--enable-fribidi
=====================================
extras/package/raspberry/configure.sh
=====================================
@@ -8,7 +8,6 @@ OPTIONS="
--enable-theora
--enable-avcodec --enable-merge-ffmpeg
--enable-libass
- --enable-schroedinger
--enable-live555
--enable-dvdread
--enable-shout
=====================================
extras/package/wasm-emscripten/build.sh
=====================================
@@ -140,8 +140,8 @@ diagnostic "vlc contribs: bootstrap"
--disable-asdcplib --disable-caca --disable-gettext \
--disable-goom \
--disable-lua --disable-luac --disable-sqlite \
- --disable-medialibrary --disable-mpcdec --disable-schroedinger \
- --disable-orc --disable-protobuf --disable-sidplay2 \
+ --disable-medialibrary --disable-mpcdec \
+ --disable-protobuf --disable-sidplay2 \
--disable-spatialaudio --disable-speex \
--disable-speexdsp --disable-taglib --disable-zvbi \
--disable-rnnoise --disable-libaribcaption \
=====================================
extras/package/win32/build.sh
=====================================
@@ -468,7 +468,7 @@ cd ../..
# configuration matching configure.sh (goom is called goom2, theora is
theoradec+theoraenc)
MCONFIGFLAGS="-Dlua=enabled -Dflac=enabled -Dtheoradec=enabled
-Dtheoraenc=enabled \
-Davcodec=enabled -Dmerge-ffmpeg=true \
- -Dlibass=enabled -Dschroedinger=enabled -Dshout=enabled -Dgoom2=enabled \
+ -Dlibass=enabled -Dshout=enabled -Dgoom2=enabled \
-Dsse=enabled -Dzvbi=enabled -Dtelx=disabled $MCONFIGFLAGS"
MCONFIGFLAGS="$MCONFIGFLAGS --prefer-static"
=====================================
extras/package/win32/configure.sh
=====================================
@@ -6,7 +6,6 @@ OPTIONS="
--enable-theora
--enable-avcodec --enable-merge-ffmpeg
--enable-libass
- --enable-schroedinger
--enable-shout
--enable-goom
--enable-sse
=====================================
meson_options.txt
=====================================
@@ -244,11 +244,6 @@ option('mpg123',
value : 'auto',
description : 'Enable/disable libmpg123 support')
-option('schroedinger',
- type : 'feature',
- value : 'auto',
- description : 'Enable/disable schroedinger support')
-
option('openapv',
type : 'feature',
value : 'auto',
=====================================
modules/codec/Makefile.am
=====================================
@@ -95,14 +95,6 @@ if ENABLE_SOUT
codec_LTLIBRARIES += librtpvideo_plugin.la
endif
-
-libschroedinger_plugin_la_SOURCES = codec/schroedinger.c
-libschroedinger_plugin_la_CFLAGS = $(AM_CFLAGS) $(CFLAGS_schroedinger)
-libschroedinger_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(codecdir)'
-libschroedinger_plugin_la_LIBADD = $(LIBS_schroedinger)
-EXTRA_LTLIBRARIES += libschroedinger_plugin.la
-codec_LTLIBRARIES += $(LTLIBschroedinger)
-
libopenapv_plugin_la_SOURCES = codec/openapv.c
libopenapv_plugin_la_CFLAGS = $(AM_CFLAGS) $(CFLAGS_openapv)
libopenapv_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(codecdir)'
=====================================
modules/codec/meson.build
=====================================
@@ -157,18 +157,6 @@ vlc_modules += {
'sources' : files('rtpvideo.c')
}
-# Dirac decoder and encoder using schroedinger
-schroedinger_dep = dependency('schroedinger-1.0',
- version: '>= 1.0.10',
- required: get_option('schroedinger'))
-vlc_modules += {
- 'name' : 'schroedinger',
- 'sources' : files('schroedinger.c'),
- 'dependencies' : [schroedinger_dep],
- 'enabled' : schroedinger_dep.found(),
-}
-
-# Dirac decoder and encoder using schroedinger
openapv_dep = dependency('oapv',
version: '>= 0.2',
required: get_option('openapv'))
=====================================
modules/codec/schroedinger.c deleted
=====================================
@@ -1,1612 +0,0 @@
-/*****************************************************************************
- * schroedinger.c: Dirac decoder module making use of libschroedinger.
- * (http://www.bbc.co.uk/rd/projects/dirac/index.shtml)
- * (http://diracvideo.org)
- *****************************************************************************
- * Copyright (C) 2008-2011 VLC authors and VideoLAN
- *
- * Authors: Jonathan Rosser <[email protected]>
- * David Flynn <davidf at rd dot bbc.co.uk>
- * Anuradha Suraparaju <asuraparaju at gmail dot com>
- *
- * This program 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.
- *
- * This program 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 this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
- *****************************************************************************/
-
-/*****************************************************************************
- * Preamble
- *****************************************************************************/
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <assert.h>
-
-#include <vlc_common.h>
-#include <vlc_configuration.h>
-#include <vlc_plugin.h>
-#include <vlc_codec.h>
-#include <vlc_timestamp_helper.h>
-
-#include <schroedinger/schro.h>
-
-/*****************************************************************************
- * Module descriptor
- *****************************************************************************/
-static int OpenDecoder ( vlc_object_t * );
-static void CloseDecoder ( vlc_object_t * );
-#ifdef ENABLE_SOUT
-static int OpenEncoder ( vlc_object_t * );
-static void CloseEncoder ( encoder_t * );
-
-#define ENC_CFG_PREFIX "sout-schro-"
-
-#define ENC_CHROMAFMT "chroma-fmt"
-#define ENC_CHROMAFMT_TEXT N_("Chroma format")
-#define ENC_CHROMAFMT_LONGTEXT N_("Picking chroma format will force a " \
- "conversion of the video into that format")
-static const char *const enc_chromafmt_list[] =
- { "420", "422", "444" };
-static const char *const enc_chromafmt_list_text[] =
- { N_("4:2:0"), N_("4:2:2"), N_("4:4:4") };
-
-#define ENC_RATE_CONTROL "rate-control"
-#define ENC_RATE_CONTROL_TEXT N_("Rate control method")
-#define ENC_RATE_CONTROL_LONGTEXT N_("Method used to encode the video
sequence")
-
-static const char *enc_rate_control_list[] = {
- "constant_noise_threshold",
- "constant_bitrate",
- "low_delay",
- "lossless",
- "constant_lambda",
- "constant_error",
- "constant_quality"
-};
-
-static const char *enc_rate_control_list_text[] = {
- N_("Constant noise threshold mode"),
- N_("Constant bitrate mode (CBR)"),
- N_("Low Delay mode"),
- N_("Lossless mode"),
- N_("Constant lambda mode"),
- N_("Constant error mode"),
- N_("Constant quality mode")
-};
-
-#define ENC_GOP_STRUCTURE "gop-structure"
-#define ENC_GOP_STRUCTURE_TEXT N_("GOP structure")
-#define ENC_GOP_STRUCTURE_LONGTEXT N_("GOP structure used to encode the video
sequence")
-
-static const char *enc_gop_structure_list[] = {
- "adaptive",
- "intra_only",
- "backref",
- "chained_backref",
- "biref",
- "chained_biref"
-};
-
-static const char *enc_gop_structure_list_text[] = {
- N_("No fixed gop structure. A picture can be intra or inter and refer to
previous or future pictures."),
- N_("I-frame only sequence"),
- N_("Inter pictures refer to previous pictures only"),
- N_("Inter pictures refer to previous pictures only"),
- N_("Inter pictures can refer to previous or future pictures"),
- N_("Inter pictures can refer to previous or future pictures")
-};
-
-#define ENC_QUALITY "quality"
-#define ENC_QUALITY_TEXT N_("Constant quality factor")
-#define ENC_QUALITY_LONGTEXT N_("Quality factor to use in constant quality
mode")
-
-#define ENC_NOISE_THRESHOLD "noise-threshold"
-#define ENC_NOISE_THRESHOLD_TEXT N_("Noise Threshold")
-#define ENC_NOISE_THRESHOLD_LONGTEXT N_("Noise threshold to use in constant
noise threshold mode")
-
-#define ENC_BITRATE "bitrate"
-#define ENC_BITRATE_TEXT N_("CBR bitrate (kbps)")
-#define ENC_BITRATE_LONGTEXT N_("Target bitrate in kbps when encoding in
constant bitrate mode")
-
-#define ENC_MAX_BITRATE "max-bitrate"
-#define ENC_MAX_BITRATE_TEXT N_("Maximum bitrate (kbps)")
-#define ENC_MAX_BITRATE_LONGTEXT N_("Maximum bitrate in kbps when encoding in
constant bitrate mode")
-
-#define ENC_MIN_BITRATE "min-bitrate"
-#define ENC_MIN_BITRATE_TEXT N_("Minimum bitrate (kbps)")
-#define ENC_MIN_BITRATE_LONGTEXT N_("Minimum bitrate in kbps when encoding in
constant bitrate mode")
-
-#define ENC_AU_DISTANCE "gop-length"
-#define ENC_AU_DISTANCE_TEXT N_("GOP length")
-#define ENC_AU_DISTANCE_LONGTEXT N_("Number of pictures between successive
sequence headers i.e. length of the group of pictures")
-
-
-#define ENC_PREFILTER "filtering"
-#define ENC_PREFILTER_TEXT N_("Prefilter")
-#define ENC_PREFILTER_LONGTEXT N_("Enable adaptive prefiltering")
-
-static const char *enc_filtering_list[] = {
- "none",
- "center_weighted_median",
- "gaussian",
- "add_noise",
- "adaptive_gaussian",
- "lowpass"
-};
-
-static const char *enc_filtering_list_text[] = {
- N_("No pre-filtering"),
- N_("Centre Weighted Median"),
- N_("Gaussian Low Pass Filter"),
- N_("Add Noise"),
- N_("Gaussian Adaptive Low Pass Filter"),
- N_("Low Pass Filter"),
-};
-
-#define ENC_PREFILTER_STRENGTH "filter-value"
-#define ENC_PREFILTER_STRENGTH_TEXT N_("Amount of prefiltering")
-#define ENC_PREFILTER_STRENGTH_LONGTEXT N_("Higher value implies more
prefiltering")
-
-#define ENC_CODINGMODE "coding-mode"
-#define ENC_CODINGMODE_TEXT N_("Picture coding mode")
-#define ENC_CODINGMODE_LONGTEXT N_("Field coding is where interlaced fields
are coded" \
- " separately as opposed to a
pseudo-progressive frame")
-static const char *const enc_codingmode_list[] =
- { "auto", "progressive", "field" };
-static const char *const enc_codingmode_list_text[] =
- { N_("auto - let encoder decide based upon input (Best)"),
- N_("force coding frame as single picture"),
- N_("force coding frame as separate interlaced fields"),
- };
-
-/* advanced option only */
-#define ENC_MCBLK_SIZE "motion-block-size"
-#define ENC_MCBLK_SIZE_TEXT N_("Size of motion compensation blocks")
-
-static const char *enc_block_size_list[] = {
- "automatic",
- "small",
- "medium",
- "large"
-};
-static const char *const enc_block_size_list_text[] =
- { N_("automatic - let encoder decide based upon input (Best)"),
- N_("small - use small motion compensation blocks"),
- N_("medium - use medium motion compensation blocks"),
- N_("large - use large motion compensation blocks"),
- };
-
-/* advanced option only */
-#define ENC_MCBLK_OVERLAP "motion-block-overlap"
-#define ENC_MCBLK_OVERLAP_TEXT N_("Overlap of motion compensation blocks")
-
-static const char *enc_block_overlap_list[] = {
- "automatic",
- "none",
- "partial",
- "full"
-};
-static const char *const enc_block_overlap_list_text[] =
- { N_("automatic - let encoder decide based upon input (Best)"),
- N_("none - Motion compensation blocks do not overlap"),
- N_("partial - Motion compensation blocks only partially overlap"),
- N_("full - Motion compensation blocks fully overlap"),
- };
-
-
-#define ENC_MVPREC "mv-precision"
-#define ENC_MVPREC_TEXT N_("Motion Vector precision")
-#define ENC_MVPREC_LONGTEXT N_("Motion Vector precision in pels")
-static const char *const enc_mvprec_list[] =
- { "1", "1/2", "1/4", "1/8" };
-
-/* advanced option only */
-#define ENC_ME_COMBINED "me-combined"
-#define ENC_ME_COMBINED_TEXT N_("Three component motion estimation")
-#define ENC_ME_COMBINED_LONGTEXT N_("Use chroma as part of the motion
estimation process")
-
-#define ENC_DWTINTRA "intra-wavelet"
-#define ENC_DWTINTRA_TEXT N_("Intra picture DWT filter")
-
-#define ENC_DWTINTER "inter-wavelet"
-#define ENC_DWTINTER_TEXT N_("Inter picture DWT filter")
-
-static const char *enc_wavelet_list[] = {
- "desl_dubuc_9_7",
- "le_gall_5_3",
- "desl_dubuc_13_7",
- "haar_0",
- "haar_1",
- "fidelity",
- "daub_9_7"
-};
-
-static const char *enc_wavelet_list_text[] = {
- "Deslauriers-Dubuc (9,7)",
- "LeGall (5,3)",
- "Deslauriers-Dubuc (13,7)",
- "Haar with no shift",
- "Haar with single shift per level",
- "Fidelity filter",
- "Daubechies (9,7) integer approximation"
-};
-
-#define ENC_DWTDEPTH "transform-depth"
-#define ENC_DWTDEPTH_TEXT N_("Number of DWT iterations")
-#define ENC_DWTDEPTH_LONGTEXT N_("Also known as DWT levels")
-
-
-/* advanced option only */
-#define ENC_MULTIQUANT "enable-multiquant"
-#define ENC_MULTIQUANT_TEXT N_("Enable multiple quantizers")
-#define ENC_MULTIQUANT_LONGTEXT N_("Enable multiple quantizers per subband
(one per codeblock)")
-
-/* advanced option only */
-#define ENC_NOAC "enable-noarith"
-#define ENC_NOAC_TEXT N_("Disable arithmetic coding")
-#define ENC_NOAC_LONGTEXT N_("Use variable length codes instead, useful for
very high bitrates")
-
-/* visual modelling */
-/* advanced option only */
-#define ENC_PWT "perceptual-weighting"
-#define ENC_PWT_TEXT N_("perceptual weighting method")
-
-static const char *enc_perceptual_weighting_list[] = {
- "none",
- "ccir959",
- "moo",
- "manos_sakrison"
-};
-
-/* advanced option only */
-#define ENC_PDIST "perceptual-distance"
-#define ENC_PDIST_TEXT N_("perceptual distance")
-#define ENC_PDIST_LONGTEXT N_("perceptual distance to calculate perceptual
weight")
-
-/* advanced option only */
-#define ENC_HSLICES "horiz-slices"
-#define ENC_HSLICES_TEXT N_("Horizontal slices per frame")
-#define ENC_HSLICES_LONGTEXT N_("Number of horizontal slices per frame in low
delay mode")
-
-/* advanced option only */
-#define ENC_VSLICES "vert-slices"
-#define ENC_VSLICES_TEXT N_("Vertical slices per frame")
-#define ENC_VSLICES_LONGTEXT N_("Number of vertical slices per frame in low
delay mode")
-
-/* advanced option only */
-#define ENC_SCBLK_SIZE "codeblock-size"
-#define ENC_SCBLK_SIZE_TEXT N_("Size of code blocks in each subband")
-
-static const char *enc_codeblock_size_list[] = {
- "automatic",
- "small",
- "medium",
- "large",
- "full"
-};
-static const char *const enc_codeblock_size_list_text[] =
- { N_("automatic - let encoder decide based upon input (Best)"),
- N_("small - use small code blocks"),
- N_("medium - use medium sized code blocks"),
- N_("large - use large code blocks"),
- N_("full - One code block per subband"),
- };
-
-/* advanced option only */
-#define ENC_ME_HIERARCHICAL "enable-hierarchical-me"
-#define ENC_ME_HIERARCHICAL_TEXT N_("Enable hierarchical Motion Estimation")
-
-/* advanced option only */
-#define ENC_ME_DOWNSAMPLE_LEVELS "downsample-levels"
-#define ENC_ME_DOWNSAMPLE_LEVELS_TEXT N_("Number of levels of downsampling")
-#define ENC_ME_DOWNSAMPLE_LEVELS_LONGTEXT N_("Number of levels of downsampling
in hierarchical motion estimation mode")
-
-/* advanced option only */
-#define ENC_ME_GLOBAL_MOTION "enable-global-me"
-#define ENC_ME_GLOBAL_MOTION_TEXT N_("Enable Global Motion Estimation")
-
-/* advanced option only */
-#define ENC_ME_PHASECORR "enable-phasecorr-me"
-#define ENC_ME_PHASECORR_TEXT N_("Enable Phase Correlation Estimation")
-
-/* advanced option only */
-#define ENC_SCD "enable-scd"
-#define ENC_SCD_TEXT N_("Enable Scene Change Detection")
-
-/* advanced option only */
-#define ENC_FORCE_PROFILE "force-profile"
-#define ENC_FORCE_PROFILE_TEXT N_("Force Profile")
-
-static const char *enc_profile_list[] = {
- "auto",
- "vc2_low_delay",
- "vc2_simple",
- "vc2_main",
- "main"
-};
-
-static const char *const enc_profile_list_text[] =
- { N_("automatic - let encoder decide based upon input (Best)"),
- N_("VC2 Low Delay Profile"),
- N_("VC2 Simple Profile"),
- N_("VC2 Main Profile"),
- N_("Main Profile"),
- };
-
-static const char *const ppsz_enc_options[] = {
- ENC_RATE_CONTROL, ENC_GOP_STRUCTURE, ENC_QUALITY, ENC_NOISE_THRESHOLD,
ENC_BITRATE,
- ENC_MIN_BITRATE, ENC_MAX_BITRATE, ENC_AU_DISTANCE, ENC_CHROMAFMT,
- ENC_PREFILTER, ENC_PREFILTER_STRENGTH, ENC_CODINGMODE, ENC_MCBLK_SIZE,
- ENC_MCBLK_OVERLAP, ENC_MVPREC, ENC_ME_COMBINED, ENC_DWTINTRA, ENC_DWTINTER,
- ENC_DWTDEPTH, ENC_MULTIQUANT, ENC_NOAC, ENC_PWT, ENC_PDIST, ENC_HSLICES,
- ENC_VSLICES, ENC_SCBLK_SIZE, ENC_ME_HIERARCHICAL, ENC_ME_DOWNSAMPLE_LEVELS,
- ENC_ME_GLOBAL_MOTION, ENC_ME_PHASECORR, ENC_SCD, ENC_FORCE_PROFILE,
- NULL
-};
-#endif // !ENABLE_SOUT
-
-
-/* Module declaration */
-
-vlc_module_begin ()
- set_subcategory( SUBCAT_INPUT_VCODEC )
- set_shortname( "Schroedinger" )
- set_description( N_("Dirac video decoder using libschroedinger") )
- set_capability( "video decoder", 200 )
- set_callbacks( OpenDecoder, CloseDecoder )
- add_shortcut( "schroedinger" )
-
-#ifdef ENABLE_SOUT
- /* encoder */
- add_submodule()
- set_section( N_("Encoding") , NULL )
- set_description( N_("Dirac video encoder using libschroedinger") )
- set_capability( "video encoder", 110 )
- set_callback( OpenEncoder )
- add_shortcut( "schroedinger", "schro" )
-
- add_string( ENC_CFG_PREFIX ENC_RATE_CONTROL, NULL,
- ENC_RATE_CONTROL_TEXT, ENC_RATE_CONTROL_LONGTEXT )
- change_string_list( enc_rate_control_list, enc_rate_control_list_text )
-
- add_float( ENC_CFG_PREFIX ENC_QUALITY, -1.,
- ENC_QUALITY_TEXT, ENC_QUALITY_LONGTEXT )
- change_float_range(-1., 10.)
-
- add_float( ENC_CFG_PREFIX ENC_NOISE_THRESHOLD, -1.,
- ENC_NOISE_THRESHOLD_TEXT, ENC_NOISE_THRESHOLD_LONGTEXT )
- change_float_range(-1., 100.)
-
- add_integer( ENC_CFG_PREFIX ENC_BITRATE, -1,
- ENC_BITRATE_TEXT, ENC_BITRATE_LONGTEXT )
- change_integer_range(-1, INT_MAX)
-
- add_integer( ENC_CFG_PREFIX ENC_MAX_BITRATE, -1,
- ENC_MAX_BITRATE_TEXT, ENC_MAX_BITRATE_LONGTEXT )
- change_integer_range(-1, INT_MAX)
-
- add_integer( ENC_CFG_PREFIX ENC_MIN_BITRATE, -1,
- ENC_MIN_BITRATE_TEXT, ENC_MIN_BITRATE_LONGTEXT )
- change_integer_range(-1, INT_MAX)
-
- add_string( ENC_CFG_PREFIX ENC_GOP_STRUCTURE, NULL,
- ENC_GOP_STRUCTURE_TEXT, ENC_GOP_STRUCTURE_LONGTEXT )
- change_string_list( enc_gop_structure_list, enc_gop_structure_list_text )
-
- add_integer( ENC_CFG_PREFIX ENC_AU_DISTANCE, -1,
- ENC_AU_DISTANCE_TEXT, ENC_AU_DISTANCE_LONGTEXT )
- change_integer_range(-1, INT_MAX)
-
- add_string( ENC_CFG_PREFIX ENC_CHROMAFMT, "420",
- ENC_CHROMAFMT_TEXT, ENC_CHROMAFMT_LONGTEXT )
- change_string_list( enc_chromafmt_list, enc_chromafmt_list_text )
-
- add_string( ENC_CFG_PREFIX ENC_CODINGMODE, "auto",
- ENC_CODINGMODE_TEXT, ENC_CODINGMODE_LONGTEXT )
- change_string_list( enc_codingmode_list, enc_codingmode_list_text )
-
- add_string( ENC_CFG_PREFIX ENC_MVPREC, NULL,
- ENC_MVPREC_TEXT, ENC_MVPREC_LONGTEXT )
- change_string_list( enc_mvprec_list, enc_mvprec_list )
-
- /* advanced option only */
- add_string( ENC_CFG_PREFIX ENC_MCBLK_SIZE, NULL,
- ENC_MCBLK_SIZE_TEXT, NULL )
- change_string_list( enc_block_size_list, enc_block_size_list_text )
-
-
- /* advanced option only */
- add_string( ENC_CFG_PREFIX ENC_MCBLK_OVERLAP, NULL,
- ENC_MCBLK_OVERLAP_TEXT, NULL )
- change_string_list( enc_block_overlap_list, enc_block_overlap_list_text )
-
- /* advanced option only */
- add_integer( ENC_CFG_PREFIX ENC_ME_COMBINED, -1,
- ENC_ME_COMBINED_TEXT, ENC_ME_COMBINED_LONGTEXT )
- change_integer_range(-1, 1 )
-
- /* advanced option only */
- add_integer( ENC_CFG_PREFIX ENC_ME_HIERARCHICAL, -1,
- ENC_ME_HIERARCHICAL_TEXT, NULL )
- change_integer_range(-1, 1 )
-
- /* advanced option only */
- add_integer( ENC_CFG_PREFIX ENC_ME_DOWNSAMPLE_LEVELS, -1,
- ENC_ME_DOWNSAMPLE_LEVELS_TEXT,
ENC_ME_DOWNSAMPLE_LEVELS_LONGTEXT )
- change_integer_range(-1, 8 )
-
- /* advanced option only */
- add_integer( ENC_CFG_PREFIX ENC_ME_GLOBAL_MOTION, -1,
- ENC_ME_GLOBAL_MOTION_TEXT, NULL )
- change_integer_range(-1, 1 )
-
- /* advanced option only */
- add_integer( ENC_CFG_PREFIX ENC_ME_PHASECORR, -1,
- ENC_ME_PHASECORR_TEXT, NULL )
- change_integer_range(-1, 1 )
-
- add_string( ENC_CFG_PREFIX ENC_DWTINTRA, NULL,
- ENC_DWTINTRA_TEXT, NULL )
- change_string_list( enc_wavelet_list, enc_wavelet_list_text )
-
- add_string( ENC_CFG_PREFIX ENC_DWTINTER, NULL,
- ENC_DWTINTER_TEXT, NULL )
- change_string_list( enc_wavelet_list, enc_wavelet_list_text )
-
- add_integer( ENC_CFG_PREFIX ENC_DWTDEPTH, -1,
- ENC_DWTDEPTH_TEXT, ENC_DWTDEPTH_LONGTEXT )
- change_integer_range(-1, SCHRO_LIMIT_ENCODER_TRANSFORM_DEPTH )
-
- /* advanced option only */
- add_integer( ENC_CFG_PREFIX ENC_MULTIQUANT, -1,
- ENC_MULTIQUANT_TEXT, ENC_MULTIQUANT_LONGTEXT )
- change_integer_range(-1, 1 )
-
- /* advanced option only */
- add_string( ENC_CFG_PREFIX ENC_SCBLK_SIZE, NULL,
- ENC_SCBLK_SIZE_TEXT, NULL )
- change_string_list( enc_codeblock_size_list, enc_codeblock_size_list_text )
-
- add_string( ENC_CFG_PREFIX ENC_PREFILTER, NULL,
- ENC_PREFILTER_TEXT, ENC_PREFILTER_LONGTEXT )
- change_string_list( enc_filtering_list, enc_filtering_list_text )
-
- add_float( ENC_CFG_PREFIX ENC_PREFILTER_STRENGTH, -1.,
- ENC_PREFILTER_STRENGTH_TEXT, ENC_PREFILTER_STRENGTH_LONGTEXT )
- change_float_range(-1., 100.0)
-
- /* advanced option only */
- add_integer( ENC_CFG_PREFIX ENC_SCD, -1,
- ENC_SCD_TEXT, NULL )
- change_integer_range(-1, 1 )
-
- /* advanced option only */
- add_string( ENC_CFG_PREFIX ENC_PWT, NULL,
- ENC_PWT_TEXT, NULL )
- change_string_list( enc_perceptual_weighting_list,
enc_perceptual_weighting_list )
-
- /* advanced option only */
- add_float( ENC_CFG_PREFIX ENC_PDIST, -1,
- ENC_PDIST_TEXT, ENC_PDIST_LONGTEXT )
- change_float_range(-1., 100.)
-
- /* advanced option only */
- add_integer( ENC_CFG_PREFIX ENC_NOAC, -1,
- ENC_NOAC_TEXT, ENC_NOAC_LONGTEXT )
- change_integer_range(-1, 1 )
-
- /* advanced option only */
- add_integer( ENC_CFG_PREFIX ENC_HSLICES, -1,
- ENC_HSLICES_TEXT, ENC_HSLICES_LONGTEXT )
- change_integer_range(-1, INT_MAX )
-
- /* advanced option only */
- add_integer( ENC_CFG_PREFIX ENC_VSLICES, -1,
- ENC_VSLICES_TEXT, ENC_VSLICES_LONGTEXT )
- change_integer_range(-1, INT_MAX )
-
- /* advanced option only */
- add_string( ENC_CFG_PREFIX ENC_FORCE_PROFILE, NULL,
- ENC_FORCE_PROFILE_TEXT, NULL )
- change_string_list( enc_profile_list, enc_profile_list_text )
-#endif // !ENABLE_SOUT
-
-vlc_module_end ()
-
-
-/*****************************************************************************
- * Local prototypes
- *****************************************************************************/
-static int DecodeBlock ( decoder_t *p_dec, block_t *p_block );
-static void Flush( decoder_t * );
-
-struct picture_free_t
-{
- picture_t *p_pic;
- decoder_t *p_dec;
-};
-
-/*****************************************************************************
- * decoder_sys_t : Schroedinger decoder descriptor
- *****************************************************************************/
-typedef struct
-{
- /*
- * Dirac properties
- */
- vlc_tick_t i_lastpts;
- vlc_tick_t i_frame_pts_delta;
- SchroDecoder *p_schro;
- SchroVideoFormat *p_format;
-} decoder_sys_t;
-
-/*****************************************************************************
- * OpenDecoder: probe the decoder and return score
- *****************************************************************************/
-static int OpenDecoder( vlc_object_t *p_this )
-{
- decoder_t *p_dec = (decoder_t*)p_this;
- decoder_sys_t *p_sys;
- SchroDecoder *p_schro;
-
- if( p_dec->fmt_in->i_codec != VLC_CODEC_DIRAC )
- {
- return VLC_EGENERIC;
- }
-
- /* Allocate the memory needed to store the decoder's structure */
- p_sys = malloc(sizeof(decoder_sys_t));
- if( p_sys == NULL )
- return VLC_ENOMEM;
-
- /* Initialise the schroedinger (and hence liboil libraries */
- /* This does no allocation and is safe to call */
- schro_init();
-
- /* Initialise the schroedinger decoder */
- if( !(p_schro = schro_decoder_new()) )
- {
- free( p_sys );
- return VLC_EGENERIC;
- }
-
- p_dec->p_sys = p_sys;
- p_sys->p_schro = p_schro;
- p_sys->p_format = NULL;
- p_sys->i_lastpts = VLC_TICK_INVALID;
- p_sys->i_frame_pts_delta = 0;
-
- /* Set output properties */
- p_dec->fmt_out.i_codec = VLC_CODEC_I420;
-
- /* Set callbacks */
- p_dec->pf_decode = DecodeBlock;
- p_dec->pf_flush = Flush;
-
- return VLC_SUCCESS;
-}
-
-/*****************************************************************************
- * SetPictureFormat: Set the decoded picture params to the ones from the stream
- *****************************************************************************/
-static void SetVideoFormat( decoder_t *p_dec )
-{
- decoder_sys_t *p_sys = p_dec->p_sys;
-
- p_sys->p_format = schro_decoder_get_video_format(p_sys->p_schro);
- if( p_sys->p_format == NULL ) return;
-
- p_sys->i_frame_pts_delta = VLC_TICK_FROM_SEC(1)
- * p_sys->p_format->frame_rate_denominator
- / p_sys->p_format->frame_rate_numerator;
-
- switch( p_sys->p_format->chroma_format )
- {
- case SCHRO_CHROMA_420: p_dec->fmt_out.i_codec = VLC_CODEC_I420; break;
- case SCHRO_CHROMA_422: p_dec->fmt_out.i_codec = VLC_CODEC_I422; break;
- case SCHRO_CHROMA_444: p_dec->fmt_out.i_codec = VLC_CODEC_I444; break;
- default:
- p_dec->fmt_out.i_codec = 0;
- break;
- }
-
- p_dec->fmt_out.video.i_visible_width = p_sys->p_format->clean_width;
- p_dec->fmt_out.video.i_x_offset = p_sys->p_format->left_offset;
- p_dec->fmt_out.video.i_width = p_sys->p_format->width;
-
- p_dec->fmt_out.video.i_visible_height = p_sys->p_format->clean_height;
- p_dec->fmt_out.video.i_y_offset = p_sys->p_format->top_offset;
- p_dec->fmt_out.video.i_height = p_sys->p_format->height;
-
- /* aspect_ratio_[numerator|denominator] describes the pixel aspect ratio */
- p_dec->fmt_out.video.i_sar_num = p_sys->p_format->aspect_ratio_numerator;
- p_dec->fmt_out.video.i_sar_den = p_sys->p_format->aspect_ratio_denominator;
-
- p_dec->fmt_out.video.i_frame_rate =
- p_sys->p_format->frame_rate_numerator;
- p_dec->fmt_out.video.i_frame_rate_base =
- p_sys->p_format->frame_rate_denominator;
-}
-
-/*****************************************************************************
- * SchroFrameFree: schro_frame callback to release the associated picture_t
- * When schro_decoder_reset() is called there will be pictures in the
- * decoding pipeline that need to be released rather than displayed.
- *****************************************************************************/
-static void SchroFrameFree( SchroFrame *frame, void *priv)
-{
- struct picture_free_t *p_free = priv;
-
- if( !p_free )
- return;
-
- picture_Release( p_free->p_pic );
- free(p_free);
- (void)frame;
-}
-
-/*****************************************************************************
- * CreateSchroFrameFromPic: wrap a picture_t in a SchroFrame
- *****************************************************************************/
-static SchroFrame *CreateSchroFrameFromPic( decoder_t *p_dec )
-{
- decoder_sys_t *p_sys = p_dec->p_sys;
- SchroFrame *p_schroframe = schro_frame_new();
- picture_t *p_pic = NULL;
- struct picture_free_t *p_free;
-
- if( !p_schroframe )
- return NULL;
-
- if( decoder_UpdateVideoFormat( p_dec ) )
- return NULL;
- p_pic = decoder_NewPicture( p_dec );
-
- if( !p_pic )
- return NULL;
-
- p_schroframe->format = SCHRO_FRAME_FORMAT_U8_420;
- if( p_sys->p_format->chroma_format == SCHRO_CHROMA_422 )
- {
- p_schroframe->format = SCHRO_FRAME_FORMAT_U8_422;
- }
- else if( p_sys->p_format->chroma_format == SCHRO_CHROMA_444 )
- {
- p_schroframe->format = SCHRO_FRAME_FORMAT_U8_444;
- }
-
- p_schroframe->width = p_sys->p_format->width;
- p_schroframe->height = p_sys->p_format->height;
-
- p_free = malloc( sizeof( *p_free ) );
- p_free->p_pic = p_pic;
- p_free->p_dec = p_dec;
- schro_frame_set_free_callback( p_schroframe, SchroFrameFree, p_free );
-
- for( int i=0; i<3; i++ )
- {
- p_schroframe->components[i].width = p_pic->p[i].i_visible_pitch;
- p_schroframe->components[i].stride = p_pic->p[i].i_pitch;
- p_schroframe->components[i].height = p_pic->p[i].i_visible_lines;
- p_schroframe->components[i].length =
- p_pic->p[i].i_pitch * p_pic->p[i].i_lines;
- p_schroframe->components[i].data = p_pic->p[i].p_pixels;
-
- if(i!=0)
- {
- p_schroframe->components[i].v_shift =
- SCHRO_FRAME_FORMAT_V_SHIFT( p_schroframe->format );
- p_schroframe->components[i].h_shift =
- SCHRO_FRAME_FORMAT_H_SHIFT( p_schroframe->format );
- }
- }
-
- p_pic->b_progressive = !p_sys->p_format->interlaced;
- p_pic->b_top_field_first = p_sys->p_format->top_field_first;
- p_pic->i_nb_fields = 2;
-
- return p_schroframe;
-}
-
-/*****************************************************************************
- * SchroBufferFree: schro_buffer callback to release the associated block_t
- *****************************************************************************/
-static void SchroBufferFree( SchroBuffer *buf, void *priv )
-{
- block_t *p_block = priv;
-
- if( !p_block )
- return;
-
- block_Release( p_block );
- (void)buf;
-}
-
-/*****************************************************************************
- * CloseDecoder: decoder destruction
- *****************************************************************************/
-static void CloseDecoder( vlc_object_t *p_this )
-{
- decoder_t *p_dec = (decoder_t *)p_this;
- decoder_sys_t *p_sys = p_dec->p_sys;
-
- schro_decoder_free( p_sys->p_schro );
- free( p_sys );
-}
-
-/*****************************************************************************
- * Flush:
- *****************************************************************************/
-static void Flush( decoder_t *p_dec )
-{
- decoder_sys_t *p_sys = p_dec->p_sys;
-
- schro_decoder_reset( p_sys->p_schro );
- p_sys->i_lastpts = VLC_TICK_INVALID;
-}
-
-/****************************************************************************
- * DecodeBlock: the whole thing
- ****************************************************************************
- * Blocks need not be Dirac dataunit aligned.
- * If a block has a PTS signaled, it applies to the first picture at or after
p_block
- ****************************************************************************/
-static int DecodeBlock( decoder_t *p_dec, block_t *p_block )
-{
- decoder_sys_t *p_sys = p_dec->p_sys;
-
- if( !p_block ) /* No Drain */
- return VLCDEC_SUCCESS;
- else {
-
- /* reset the decoder when seeking as the decode in progress is invalid
*/
- /* discard the block as it is just a null magic block */
- if( p_block->i_flags & (BLOCK_FLAG_CORRUPTED|BLOCK_FLAG_DISCONTINUITY)
)
- {
- Flush( p_dec );
- if( p_block->i_flags & BLOCK_FLAG_CORRUPTED )
- {
- block_Release( p_block );
- return VLCDEC_SUCCESS;
- }
- }
-
- SchroBuffer *p_schrobuffer;
- p_schrobuffer = schro_buffer_new_with_data( p_block->p_buffer,
p_block->i_buffer );
- p_schrobuffer->free = SchroBufferFree;
- p_schrobuffer->priv = p_block;
- if( p_block->i_pts != VLC_TICK_INVALID ) {
- vlc_tick_t *p_pts = malloc( sizeof(*p_pts) );
- if( p_pts ) {
- *p_pts = p_block->i_pts;
- /* if this call fails, p_pts is freed automatically */
- p_schrobuffer->tag = schro_tag_new( p_pts, free );
- }
- }
-
- /* this stops the same block being fed back into this function if
- * we were on the next iteration of this loop to output a picture */
- schro_decoder_autoparse_push( p_sys->p_schro, p_schrobuffer );
- /* DO NOT refer to p_block after this point, it may have been freed */
- }
-
- while( 1 )
- {
- SchroFrame *p_schroframe;
- picture_t *p_pic;
- int state = schro_decoder_autoparse_wait( p_sys->p_schro );
-
- switch( state )
- {
- case SCHRO_DECODER_FIRST_ACCESS_UNIT:
- SetVideoFormat( p_dec );
- break;
-
- case SCHRO_DECODER_NEED_BITS:
- return VLCDEC_SUCCESS;
-
- case SCHRO_DECODER_NEED_FRAME:
- p_schroframe = CreateSchroFrameFromPic( p_dec );
-
- if( !p_schroframe )
- {
- msg_Err( p_dec, "Could not allocate picture for decoder");
- return VLCDEC_SUCCESS;
- }
-
- schro_decoder_add_output_picture( p_sys->p_schro, p_schroframe);
- break;
-
- case SCHRO_DECODER_OK: {
- SchroTag *p_tag = schro_decoder_get_picture_tag( p_sys->p_schro );
- p_schroframe = schro_decoder_pull( p_sys->p_schro );
- if( !p_schroframe || !p_schroframe->priv )
- {
- /* frame can't be one that was allocated by us
- * -- no private data: discard */
- if( p_tag ) schro_tag_free( p_tag );
- if( p_schroframe ) schro_frame_unref( p_schroframe );
- break;
- }
- p_pic = ((struct picture_free_t*) p_schroframe->priv)->p_pic;
- p_schroframe->priv = NULL;
-
- if( p_tag )
- {
- /* free is handled by schro_frame_unref */
- p_pic->date = *(vlc_tick_t*) p_tag->value;
- schro_tag_free( p_tag );
- }
- else if( p_sys->i_lastpts != VLC_TICK_INVALID )
- {
- /* NB, this shouldn't happen since the packetizer does a
- * very thorough job of inventing timestamps. The
- * following is just a very rough fall back in case packetizer
- * is missing. */
- /* maybe it would be better to set p_pic->b_force ? */
- p_pic->date = p_sys->i_lastpts + p_sys->i_frame_pts_delta;
- }
- p_sys->i_lastpts = p_pic->date;
-
- schro_frame_unref( p_schroframe );
- decoder_QueueVideo( p_dec, p_pic );
- return VLCDEC_SUCCESS;
- }
- case SCHRO_DECODER_EOS:
- /* NB, the new api will not emit _EOS, it handles the reset
internally */
- break;
-
- case SCHRO_DECODER_ERROR:
- msg_Err( p_dec, "SCHRO_DECODER_ERROR");
- return VLCDEC_SUCCESS;
- }
- }
-}
-
-#ifdef ENABLE_SOUT
-/*****************************************************************************
- * Local prototypes
- *****************************************************************************/
-static block_t *Encode( encoder_t *p_enc, picture_t *p_pict );
-
-
-/*****************************************************************************
- * picture_pts_t : store pts alongside picture number, not carried through
- * encoder
- *****************************************************************************/
-struct picture_pts_t
-{
- vlc_tick_t i_pts; /* associated pts */
- uint32_t u_pnum; /* dirac picture number */
- bool b_empty; /* entry is invalid */
-};
-
-/*****************************************************************************
- * encoder_sys_t : Schroedinger encoder descriptor
- *****************************************************************************/
-#define SCHRO_PTS_TLB_SIZE 256
-typedef struct
-{
- /*
- * Schro properties
- */
- SchroEncoder *p_schro;
- SchroVideoFormat *p_format;
- int started;
- bool b_auto_field_coding;
-
- uint32_t i_input_picnum;
- timestamp_fifo_t *p_dts_fifo;
-
- block_t *p_chain;
-
- struct picture_pts_t pts_tlb[SCHRO_PTS_TLB_SIZE];
- vlc_tick_t i_pts_offset;
- vlc_tick_t i_field_duration;
-
- bool b_eos_signalled;
- bool b_eos_pulled;
-} encoder_sys_t;
-
-static struct
-{
- unsigned int i_height;
- int i_approx_fps;
- SchroVideoFormatEnum i_vf;
-} schro_format_guess[] = {
- /* Important: Keep this list ordered in ascending picture height */
- {1, 0, SCHRO_VIDEO_FORMAT_CUSTOM},
- {120, 15, SCHRO_VIDEO_FORMAT_QSIF},
- {144, 12, SCHRO_VIDEO_FORMAT_QCIF},
- {240, 15, SCHRO_VIDEO_FORMAT_SIF},
- {288, 12, SCHRO_VIDEO_FORMAT_CIF},
- {480, 30, SCHRO_VIDEO_FORMAT_SD480I_60},
- {480, 15, SCHRO_VIDEO_FORMAT_4SIF},
- {576, 12, SCHRO_VIDEO_FORMAT_4CIF},
- {576, 25, SCHRO_VIDEO_FORMAT_SD576I_50},
- {720, 50, SCHRO_VIDEO_FORMAT_HD720P_50},
- {720, 60, SCHRO_VIDEO_FORMAT_HD720P_60},
- {1080, 24, SCHRO_VIDEO_FORMAT_DC2K_24},
- {1080, 25, SCHRO_VIDEO_FORMAT_HD1080I_50},
- {1080, 30, SCHRO_VIDEO_FORMAT_HD1080I_60},
- {1080, 50, SCHRO_VIDEO_FORMAT_HD1080P_50},
- {1080, 60, SCHRO_VIDEO_FORMAT_HD1080P_60},
- {2160, 24, SCHRO_VIDEO_FORMAT_DC4K_24},
- {0, 0, 0},
-};
-
-/*****************************************************************************
- * ResetPTStlb: Purge all entries in @p_enc@'s PTS-tlb
- *****************************************************************************/
-static void ResetPTStlb( encoder_t *p_enc )
-{
- encoder_sys_t *p_sys = p_enc->p_sys;
- for( int i = 0; i < SCHRO_PTS_TLB_SIZE; i++ )
- {
- p_sys->pts_tlb[i].b_empty = true;
- }
-}
-
-
-/*****************************************************************************
- * StorePicturePTS: Store the PTS value for a particular picture number
- *****************************************************************************/
-static void StorePicturePTS( encoder_t *p_enc, uint32_t u_pnum, vlc_tick_t
i_pts )
-{
- encoder_sys_t *p_sys = p_enc->p_sys;
-
- for( int i = 0; i<SCHRO_PTS_TLB_SIZE; i++ )
- {
- if( p_sys->pts_tlb[i].b_empty )
- {
- p_sys->pts_tlb[i].u_pnum = u_pnum;
- p_sys->pts_tlb[i].i_pts = i_pts;
- p_sys->pts_tlb[i].b_empty = false;
-
- return;
- }
- }
-
- msg_Err( p_enc, "Could not store PTS %"PRId64" for frame %u", i_pts,
u_pnum );
-}
-
-/*****************************************************************************
- * GetPicturePTS: Retrieve the PTS value for a particular picture number
- *****************************************************************************/
-static vlc_tick_t GetPicturePTS( encoder_t *p_enc, uint32_t u_pnum )
-{
- encoder_sys_t *p_sys = p_enc->p_sys;
-
- for( int i = 0; i < SCHRO_PTS_TLB_SIZE; i++ )
- {
- if( !p_sys->pts_tlb[i].b_empty &&
- p_sys->pts_tlb[i].u_pnum == u_pnum )
- {
- p_sys->pts_tlb[i].b_empty = true;
- return p_sys->pts_tlb[i].i_pts;
- }
- }
-
- msg_Err( p_enc, "Could not retrieve PTS for picture %u", u_pnum );
- return VLC_TICK_INVALID;
-}
-
-static inline bool SchroSetEnum( encoder_t *p_enc, int i_list_size, const char
*list[],
- const char *psz_name, const char *psz_name_text, const
char *psz_value)
-{
- encoder_sys_t *p_sys = p_enc->p_sys;
- if( list && psz_name_text && psz_name && psz_value ) {
- for( int i = 0; i < i_list_size; ++i ) {
- if( strcmp( list[i], psz_value ) )
- continue;
- schro_encoder_setting_set_double( p_sys->p_schro, psz_name, i );
- return true;
- }
- msg_Err( p_enc, "Invalid %s: %s", psz_name_text, psz_value );
- }
- return false;
-}
-
-static bool SetEncChromaFormat( encoder_t *p_enc, vlc_fourcc_t chroma )
-{
- encoder_sys_t *p_sys = p_enc->p_sys;
-
- switch( chroma ) {
- case VLC_CODEC_I420:
- p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec = chroma;
- p_sys->p_format->chroma_format = SCHRO_CHROMA_420;
- break;
- case VLC_CODEC_I422:
- p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec = chroma;
- p_sys->p_format->chroma_format = SCHRO_CHROMA_422;
- break;
- case VLC_CODEC_I444:
- p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec = chroma;
- p_sys->p_format->chroma_format = SCHRO_CHROMA_444;
- break;
- default:
- return false;
- }
-
- return true;
-}
-
-#define SCHRO_SET_FLOAT(psz_name, pschro_name) \
- f_tmp = var_GetFloat( p_enc, ENC_CFG_PREFIX psz_name ); \
- if( f_tmp >= 0.0 ) \
- schro_encoder_setting_set_double( p_sys->p_schro, pschro_name, f_tmp );
-
-#define SCHRO_SET_INTEGER(psz_name, pschro_name, ignore_val) \
- i_tmp = var_GetInteger( p_enc, ENC_CFG_PREFIX psz_name ); \
- if( i_tmp > ignore_val ) \
- schro_encoder_setting_set_double( p_sys->p_schro, pschro_name, i_tmp );
-
-#define SCHRO_SET_ENUM(list, psz_name, psz_name_text, pschro_name) \
- psz_tmp = var_GetString( p_enc, ENC_CFG_PREFIX psz_name ); \
- if( !psz_tmp ) \
- goto error; \
- else if ( *psz_tmp != '\0' ) { \
- int i_list_size = ARRAY_SIZE(list); \
- if( !SchroSetEnum( p_enc, i_list_size, list, pschro_name,
psz_name_text, psz_tmp ) ) { \
- free( psz_tmp ); \
- goto error; \
- } \
- } \
- free( psz_tmp );
-
-/*****************************************************************************
- * OpenEncoder: probe the encoder and return score
- *****************************************************************************/
-static int OpenEncoder( vlc_object_t *p_this )
-{
- encoder_t *p_enc = (encoder_t *)p_this;
- encoder_sys_t *p_sys;
- int i_tmp;
- float f_tmp;
- char *psz_tmp;
-
- if( p_enc->fmt_out.i_codec != VLC_CODEC_DIRAC &&
- !p_enc->obj.force )
- {
- return VLC_EGENERIC;
- }
-
- if( !p_enc->fmt_in.video.i_frame_rate ||
!p_enc->fmt_in.video.i_frame_rate_base ||
- !p_enc->fmt_in.video.i_visible_height ||
!p_enc->fmt_in.video.i_visible_width )
- {
- msg_Err( p_enc, "Framerate and picture dimensions must be non-zero" );
- return VLC_EGENERIC;
- }
-
- /* Allocate the memory needed to store the decoder's structure */
- if( ( p_sys = calloc( 1, sizeof( *p_sys ) ) ) == NULL )
- return VLC_ENOMEM;
-
- p_enc->p_sys = p_sys;
- p_enc->fmt_out.i_codec = VLC_CODEC_DIRAC;
- p_enc->fmt_out.i_cat = VIDEO_ES;
-
- if( ( p_sys->p_dts_fifo = timestamp_FifoNew(32) ) == NULL )
- {
- CloseEncoder( p_enc );
- return VLC_ENOMEM;
- }
-
- ResetPTStlb( p_enc );
-
- /* guess the video format based upon number of lines and picture height */
- int i = 0;
- SchroVideoFormatEnum guessed_video_fmt = SCHRO_VIDEO_FORMAT_CUSTOM;
- /* Pick the dirac_video_format in this order of preference:
- * 1. an exact match in frame height and an approximate fps match
- * 2. the previous preset with a smaller number of lines.
- */
- do
- {
- if( schro_format_guess[i].i_height > p_enc->fmt_in.video.i_height )
- {
- guessed_video_fmt = schro_format_guess[i-1].i_vf;
- break;
- }
- if( schro_format_guess[i].i_height != p_enc->fmt_in.video.i_height )
- continue;
- int src_fps = p_enc->fmt_in.video.i_frame_rate /
p_enc->fmt_in.video.i_frame_rate_base;
- int delta_fps = abs( schro_format_guess[i].i_approx_fps - src_fps );
- if( delta_fps > 2 )
- continue;
-
- guessed_video_fmt = schro_format_guess[i].i_vf;
- break;
- } while( schro_format_guess[++i].i_height );
-
- schro_init();
- p_sys->p_schro = schro_encoder_new();
- if( !p_sys->p_schro ) {
- msg_Err( p_enc, "Failed to initialize libschroedinger encoder" );
- return VLC_EGENERIC;
- }
- schro_encoder_set_packet_assembly( p_sys->p_schro, true );
-
- if( !( p_sys->p_format = schro_encoder_get_video_format( p_sys->p_schro )
) ) {
- msg_Err( p_enc, "Failed to get Schroedigner video format" );
- schro_encoder_free( p_sys->p_schro );
- return VLC_EGENERIC;
- }
-
- /* initialise the video format parameters to the guessed format */
- schro_video_format_set_std_video_format( p_sys->p_format,
guessed_video_fmt );
-
- /* constants set from the input video format */
- p_sys->p_format->width =
p_enc->fmt_in.video.i_visible_width;
- p_sys->p_format->height =
p_enc->fmt_in.video.i_visible_height;
- p_sys->p_format->frame_rate_numerator = p_enc->fmt_in.video.i_frame_rate;
- p_sys->p_format->frame_rate_denominator =
p_enc->fmt_in.video.i_frame_rate_base;
- unsigned u_asr_num, u_asr_den;
- vlc_ureduce( &u_asr_num, &u_asr_den,
- p_enc->fmt_in.video.i_sar_num,
- p_enc->fmt_in.video.i_sar_den, 0 );
- p_sys->p_format->aspect_ratio_numerator = u_asr_num;
- p_sys->p_format->aspect_ratio_denominator = u_asr_den;
-
- config_ChainParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg );
-
- SCHRO_SET_ENUM(enc_rate_control_list, ENC_RATE_CONTROL,
ENC_RATE_CONTROL_TEXT, "rate_control")
-
- SCHRO_SET_ENUM(enc_gop_structure_list, ENC_GOP_STRUCTURE,
ENC_GOP_STRUCTURE_TEXT, "gop_structure")
-
- psz_tmp = var_GetString( p_enc, ENC_CFG_PREFIX ENC_CHROMAFMT );
- if( !psz_tmp )
- goto error;
- else {
- vlc_fourcc_t i_chroma;
- if( !strcmp( psz_tmp, "420" ) ) {
- i_chroma = VLC_CODEC_I420;
- }
- else if( !strcmp( psz_tmp, "422" ) ) {
- i_chroma = VLC_CODEC_I422;
- }
- else if( !strcmp( psz_tmp, "444" ) ) {
- i_chroma = VLC_CODEC_I444;
- }
- else {
- msg_Err( p_enc, "Invalid chroma format: %s", psz_tmp );
- free( psz_tmp );
- goto error;
- }
- SetEncChromaFormat( p_enc, i_chroma );
- }
- free( psz_tmp );
-
- SCHRO_SET_FLOAT(ENC_QUALITY, "quality")
-
- SCHRO_SET_FLOAT(ENC_NOISE_THRESHOLD, "noise_threshold")
-
- /* use bitrate from sout-transcode-vb in kbps */
- i_tmp = var_GetInteger( p_enc, ENC_CFG_PREFIX ENC_BITRATE );
- if( i_tmp > -1 )
- schro_encoder_setting_set_double( p_sys->p_schro, "bitrate", i_tmp *
1000 );
- else
- schro_encoder_setting_set_double( p_sys->p_schro, "bitrate",
p_enc->fmt_out.i_bitrate );
-
- p_enc->fmt_out.i_bitrate = schro_encoder_setting_get_double(
p_sys->p_schro, "bitrate" );
-
- i_tmp = var_GetInteger( p_enc, ENC_CFG_PREFIX ENC_MIN_BITRATE );
- if( i_tmp > -1 )
- schro_encoder_setting_set_double( p_sys->p_schro, "min_bitrate", i_tmp
* 1000 );
-
- i_tmp = var_GetInteger( p_enc, ENC_CFG_PREFIX ENC_MAX_BITRATE );
- if( i_tmp > -1 )
- schro_encoder_setting_set_double( p_sys->p_schro, "max_bitrate", i_tmp
* 1000 );
-
- SCHRO_SET_INTEGER(ENC_AU_DISTANCE, "au_distance", -1)
-
- SCHRO_SET_ENUM(enc_filtering_list, ENC_PREFILTER, ENC_PREFILTER_TEXT,
"filtering")
-
- SCHRO_SET_FLOAT(ENC_PREFILTER_STRENGTH, "filter_value")
-
-
- psz_tmp = var_GetString( p_enc, ENC_CFG_PREFIX ENC_CODINGMODE );
- if( !psz_tmp )
- goto error;
- else if( !strcmp( psz_tmp, "auto" ) ) {
- p_sys->b_auto_field_coding = true;
- }
- else if( !strcmp( psz_tmp, "progressive" ) ) {
- p_sys->b_auto_field_coding = false;
- schro_encoder_setting_set_double( p_sys->p_schro, "interlaced_coding",
false);
- }
- else if( !strcmp( psz_tmp, "field" ) ) {
- p_sys->b_auto_field_coding = false;
- schro_encoder_setting_set_double( p_sys->p_schro, "interlaced_coding",
true);
- }
- else {
- msg_Err( p_enc, "Invalid codingmode: %s", psz_tmp );
- free( psz_tmp );
- goto error;
- }
- free( psz_tmp );
-
- SCHRO_SET_ENUM(enc_block_size_list, ENC_MCBLK_SIZE, ENC_MCBLK_SIZE_TEXT,
"motion_block_size")
-
- SCHRO_SET_ENUM(enc_block_overlap_list, ENC_MCBLK_OVERLAP,
ENC_MCBLK_OVERLAP_TEXT, "motion_block_overlap")
-
- psz_tmp = var_GetString( p_enc, ENC_CFG_PREFIX ENC_MVPREC );
- if( !psz_tmp )
- goto error;
- else if( *psz_tmp != '\0') {
- if( !strcmp( psz_tmp, "1" ) ) {
- schro_encoder_setting_set_double( p_sys->p_schro, "mv_precision",
0 );
- }
- else if( !strcmp( psz_tmp, "1/2" ) ) {
- schro_encoder_setting_set_double( p_sys->p_schro, "mv_precision",
1 );
- }
- else if( !strcmp( psz_tmp, "1/4" ) ) {
- schro_encoder_setting_set_double( p_sys->p_schro, "mv_precision",
2 );
- }
- else if( !strcmp( psz_tmp, "1/8" ) ) {
- schro_encoder_setting_set_double( p_sys->p_schro, "mv_precision",
3 );
- }
- else {
- msg_Err( p_enc, "Invalid mv_precision: %s", psz_tmp );
- free( psz_tmp );
- goto error;
- }
- }
- free( psz_tmp );
-
- SCHRO_SET_INTEGER(ENC_ME_COMBINED, "enable_chroma_me", -1)
-
- SCHRO_SET_ENUM(enc_wavelet_list, ENC_DWTINTRA, ENC_DWTINTRA_TEXT,
"intra_wavelet")
-
- SCHRO_SET_ENUM(enc_wavelet_list, ENC_DWTINTER, ENC_DWTINTER_TEXT,
"inter_wavelet")
-
- SCHRO_SET_INTEGER(ENC_DWTDEPTH, "transform_depth", -1)
-
- SCHRO_SET_INTEGER(ENC_MULTIQUANT, "enable_multiquant", -1)
-
- SCHRO_SET_INTEGER(ENC_NOAC, "enable_noarith", -1)
-
- SCHRO_SET_ENUM(enc_perceptual_weighting_list, ENC_PWT, ENC_PWT_TEXT,
"perceptual_weighting")
-
- SCHRO_SET_FLOAT(ENC_PDIST, "perceptual_distance")
-
- SCHRO_SET_INTEGER(ENC_HSLICES, "horiz_slices", -1)
-
- SCHRO_SET_INTEGER(ENC_VSLICES, "vert_slices", -1)
-
- SCHRO_SET_ENUM(enc_codeblock_size_list, ENC_SCBLK_SIZE,
ENC_SCBLK_SIZE_TEXT, "codeblock_size")
-
- SCHRO_SET_INTEGER(ENC_ME_HIERARCHICAL, "enable_hierarchical_estimation",
-1)
-
- SCHRO_SET_INTEGER(ENC_ME_DOWNSAMPLE_LEVELS, "downsample_levels", 1)
-
- SCHRO_SET_INTEGER(ENC_ME_GLOBAL_MOTION, "enable_global_motion", -1)
-
- SCHRO_SET_INTEGER(ENC_ME_PHASECORR, "enable_phasecorr_estimation", -1)
-
- SCHRO_SET_INTEGER(ENC_SCD, "enable_scene_change_detection", -1)
-
- SCHRO_SET_ENUM(enc_profile_list, ENC_FORCE_PROFILE,
ENC_FORCE_PROFILE_TEXT, "force_profile")
-
- p_sys->started = 0;
-
- static const struct vlc_encoder_operations ops =
- {
- .close = CloseEncoder,
- .encode_video = Encode,
- };
- p_enc->ops = &ops;
-
- return VLC_SUCCESS;
-error:
- CloseEncoder( p_enc );
- return VLC_EGENERIC;
-}
-
-
-struct enc_picture_free_t
-{
- picture_t *p_pic;
- encoder_t *p_enc;
-};
-
-/*****************************************************************************
- * EncSchroFrameFree: schro_frame callback to release the associated picture_t
- * When schro_encoder_reset() is called there will be pictures in the
- * encoding pipeline that need to be released rather than displayed.
- *****************************************************************************/
-static void EncSchroFrameFree( SchroFrame *frame, void *priv )
-{
- struct enc_picture_free_t *p_free = priv;
-
- if( !p_free )
- return;
-
- picture_Release( p_free->p_pic );
- free( p_free );
- (void)frame;
-}
-
-/*****************************************************************************
- * CreateSchroFrameFromPic: wrap a picture_t in a SchroFrame
- *****************************************************************************/
-static SchroFrame *CreateSchroFrameFromInputPic( encoder_t *p_enc, picture_t
*p_pic )
-{
- encoder_sys_t *p_sys = p_enc->p_sys;
- SchroFrame *p_schroframe = schro_frame_new();
- struct enc_picture_free_t *p_free;
-
- if( !p_schroframe )
- return NULL;
-
- if( !p_pic )
- return NULL;
-
- p_schroframe->format = SCHRO_FRAME_FORMAT_U8_420;
- if( p_sys->p_format->chroma_format == SCHRO_CHROMA_422 )
- {
- p_schroframe->format = SCHRO_FRAME_FORMAT_U8_422;
- }
- else if( p_sys->p_format->chroma_format == SCHRO_CHROMA_444 )
- {
- p_schroframe->format = SCHRO_FRAME_FORMAT_U8_444;
- }
-
- p_schroframe->width = p_sys->p_format->width;
- p_schroframe->height = p_sys->p_format->height;
-
- p_free = malloc( sizeof( *p_free ) );
- if( unlikely( p_free == NULL ) ) {
- schro_frame_unref( p_schroframe );
- return NULL;
- }
-
- p_free->p_pic = p_pic;
- p_free->p_enc = p_enc;
- schro_frame_set_free_callback( p_schroframe, EncSchroFrameFree, p_free );
-
- for( int i=0; i<3; i++ )
- {
- p_schroframe->components[i].width = p_pic->p[i].i_visible_pitch;
- p_schroframe->components[i].stride = p_pic->p[i].i_pitch;
- p_schroframe->components[i].height = p_pic->p[i].i_visible_lines;
- p_schroframe->components[i].length =
- p_pic->p[i].i_pitch * p_pic->p[i].i_lines;
- p_schroframe->components[i].data = p_pic->p[i].p_pixels;
-
- if( i!=0 )
- {
- p_schroframe->components[i].v_shift =
- SCHRO_FRAME_FORMAT_V_SHIFT( p_schroframe->format );
- p_schroframe->components[i].h_shift =
- SCHRO_FRAME_FORMAT_H_SHIFT( p_schroframe->format );
- }
- }
-
- return p_schroframe;
-}
-
-/* Attempt to find dirac picture number in an encapsulation unit */
-static int ReadDiracPictureNumber( uint32_t *p_picnum, block_t *p_block )
-{
- uint32_t u_pos = 4;
- /* protect against falling off the edge */
- while( u_pos + 13 < p_block->i_buffer )
- {
- /* find the picture startcode */
- if( p_block->p_buffer[u_pos] & 0x08 )
- {
- *p_picnum = GetDWBE( p_block->p_buffer + u_pos + 9 );
- return 1;
- }
- /* skip to the next dirac data unit */
- uint32_t u_npo = GetDWBE( p_block->p_buffer + u_pos + 1 );
- assert( u_npo <= UINT32_MAX - u_pos );
- if( u_npo == 0 )
- u_npo = 13;
- u_pos += u_npo;
- }
- return 0;
-}
-
-
-static block_t *Encode( encoder_t *p_enc, picture_t *p_pic )
-{
- encoder_sys_t *p_sys = p_enc->p_sys;
- block_t *p_block, *p_output_chain = NULL;
- SchroFrame *p_frame;
- bool b_go = true;
-
- if( !p_pic ) {
- if( !p_sys->started || p_sys->b_eos_pulled )
- return NULL;
-
- if( !p_sys->b_eos_signalled ) {
- p_sys->b_eos_signalled = 1;
- schro_encoder_end_of_stream( p_sys->p_schro );
- }
- } else {
- /* we only know if the sequence is interlaced when the first
- * picture arrives, so final setup is done here */
- /* XXX todo, detect change of interlace */
- p_sys->p_format->interlaced = !p_pic->b_progressive;
- p_sys->p_format->top_field_first = p_pic->b_top_field_first;
-
- if( p_sys->b_auto_field_coding )
- schro_encoder_setting_set_double( p_sys->p_schro,
"interlaced_coding", !p_pic->b_progressive );
- }
-
- if( !p_sys->started ) {
- date_t date;
-
- if( p_pic->format.i_chroma != p_enc->fmt_in.i_codec ) {
- msg_Warn( p_enc, "Resetting chroma from %4.4s to %4.4s",
- (const char*)&p_enc->fmt_in.i_codec,
- (const char*)&p_pic->format.i_chroma );
- if( !SetEncChromaFormat( p_enc, p_pic->format.i_chroma ) ) {
- msg_Err( p_enc, "Could not reset chroma format to %4.4s",
- (const char*)&p_pic->format.i_chroma );
- return NULL;
- }
- }
-
- date_Init( &date, p_enc->fmt_in.video.i_frame_rate * 2,
p_enc->fmt_in.video.i_frame_rate_base );
- date_Set( &date, VLC_TICK_0 );
- /* FIXME - Unlike dirac-research codec Schro doesn't have a function
that returns the delay in pics yet.
- * Use a default of 1
- */
- date_Increment( &date, 2 /* 2 fields, 1 frame */ );
- p_sys->i_pts_offset = date_Get( &date ) - VLC_TICK_0;
- if( schro_encoder_setting_get_double( p_sys->p_schro,
"interlaced_coding" ) > 0.0 ) {
- date_Set( &date, VLC_TICK_0 );
- date_Increment( &date, 1 /* field */ );
- p_sys->i_field_duration = date_Get( &date ) - VLC_TICK_0;
- }
-
- schro_video_format_set_std_signal_range( p_sys->p_format,
SCHRO_SIGNAL_RANGE_8BIT_VIDEO );
- schro_encoder_set_video_format( p_sys->p_schro, p_sys->p_format );
- schro_encoder_start( p_sys->p_schro );
- p_sys->started = 1;
- }
-
- if( !p_sys->b_eos_signalled ) {
- /* create a schro frame from the input pic and load */
- /* Increase ref count by 1 so that the picture is not freed until
- Schro finishes with it */
- picture_Hold( p_pic );
-
- p_frame = CreateSchroFrameFromInputPic( p_enc, p_pic );
- if( !p_frame )
- return NULL;
- schro_encoder_push_frame( p_sys->p_schro, p_frame );
-
-
- /* store pts in a lookaside buffer, so that the same pts may
- * be used for the picture in coded order */
- StorePicturePTS( p_enc, p_sys->i_input_picnum, p_pic->date );
- p_sys->i_input_picnum++;
-
- /* store dts in a queue, so that they appear in order in
- * coded order */
- timestamp_FifoPut( p_sys->p_dts_fifo, p_pic->date -
p_sys->i_pts_offset );
-
- /* for field coding mode, insert an extra value into both the
- * pts lookaside buffer and dts queue, offset to correspond
- * to a one field delay. */
- if( schro_encoder_setting_get_double( p_sys->p_schro,
"interlaced_coding" ) > 0.0 ) {
- StorePicturePTS( p_enc, p_sys->i_input_picnum, p_pic->date +
p_sys->i_field_duration );
- p_sys->i_input_picnum++;
-
- timestamp_FifoPut( p_sys->p_dts_fifo, p_pic->date -
p_sys->i_pts_offset + p_sys->i_field_duration );
- }
- }
-
- do
- {
- SchroStateEnum state;
- state = schro_encoder_wait( p_sys->p_schro );
- switch( state )
- {
- case SCHRO_STATE_NEED_FRAME:
- b_go = false;
- break;
- case SCHRO_STATE_AGAIN:
- break;
- case SCHRO_STATE_END_OF_STREAM:
- p_sys->b_eos_pulled = 1;
- b_go = false;
- break;
- case SCHRO_STATE_HAVE_BUFFER:
- {
- SchroBuffer *p_enc_buf;
- uint32_t u_pic_num;
- int i_presentation_frame;
- p_enc_buf = schro_encoder_pull( p_sys->p_schro,
&i_presentation_frame );
- p_block = block_Alloc( p_enc_buf->length );
- if( !p_block )
- return NULL;
-
- memcpy( p_block->p_buffer, p_enc_buf->data, p_enc_buf->length );
- schro_buffer_unref( p_enc_buf );
-
- /* Presence of a Sequence header indicates a seek point */
- if( 0 == p_block->p_buffer[4] )
- {
- p_block->i_flags |= BLOCK_FLAG_TYPE_I;
-
- if( !p_enc->fmt_out.p_extra ) {
- const uint8_t eos[] = {
'B','B','C','D',0x10,0,0,0,13,0,0,0,0 };
- uint32_t len = GetDWBE( p_block->p_buffer + 5 );
- /* if it hasn't been done so far, stash a copy of the
- * sequence header for muxers such as ogg */
- /* The OggDirac spec advises that a Dirac EOS DataUnit
- * is appended to the sequence header to allow guard
- * against poor streaming servers */
- /* XXX, should this be done using the packetizer ? */
-
- if( len > UINT32_MAX - sizeof( eos ) )
- return NULL;
-
- p_enc->fmt_out.p_extra = malloc( len + sizeof( eos ) );
- if( !p_enc->fmt_out.p_extra )
- return NULL;
- memcpy( p_enc->fmt_out.p_extra, p_block->p_buffer, len );
- memcpy( (uint8_t*)p_enc->fmt_out.p_extra + len, eos,
sizeof( eos ) );
- SetDWBE( (uint8_t*)p_enc->fmt_out.p_extra + len +
sizeof(eos) - 4, len );
- p_enc->fmt_out.i_extra = len + sizeof( eos );
- }
- }
-
- if( ReadDiracPictureNumber( &u_pic_num, p_block ) ) {
- p_block->i_dts = timestamp_FifoGet( p_sys->p_dts_fifo );
- p_block->i_pts = GetPicturePTS( p_enc, u_pic_num );
- block_ChainAppend( &p_output_chain, p_block );
- } else {
- /* End of sequence */
- block_ChainAppend( &p_output_chain, p_block );
- }
- break;
- }
- default:
- break;
- }
- } while( b_go );
-
- return p_output_chain;
-}
-
-/*****************************************************************************
- * CloseEncoder: Schro encoder destruction
- *****************************************************************************/
-static void CloseEncoder( encoder_t *p_enc )
-{
- encoder_sys_t *p_sys = p_enc->p_sys;
-
- /* Free the encoder resources */
- if( p_sys->p_schro )
- schro_encoder_free( p_sys->p_schro );
-
- free( p_sys->p_format );
-
- if( p_sys->p_dts_fifo )
- timestamp_FifoRelease( p_sys->p_dts_fifo );
-
- block_ChainRelease( p_sys->p_chain );
-
- free( p_sys );
- /* We need to reset p_sys since CloseEncoder is also called during error.
*/
- p_enc->p_sys = NULL;
-}
-#endif // !ENABLE_SOUT
=====================================
modules/gui/macosx/windows/convertandsave/VLCConvertAndSaveWindowController.m
=====================================
@@ -97,7 +97,6 @@ NSString *VLCConvertAndSaveProfileNamesKey =
@"CASProfileNames";
@"mp4;1;1;0;h264;0;0;0;0;0;mpga;128;2;44100;0;1",
@"webm;1;1;0;VP80;2000;0;0;0;0;vorb;128;2;44100;0;1",
@"ts;1;1;0;h264;800;1;0;0;0;mpga;128;2;44100;0;0",
-
@"ts;1;1;0;drac;800;1;0;0;0;mpga;128;2;44100;0;0",
@"ogg;1;1;0;theo;800;1;0;0;0;vorb;128;2;44100;0;0",
@"ogg;1;1;0;theo;800;1;0;0;0;flac;128;2;44100;0;0",
@"ts;1;1;0;mp2v;800;1;0;0;0;mpga;128;2;44100;0;0",
@@ -113,7 +112,6 @@ NSString *VLCConvertAndSaveProfileNamesKey =
@"CASProfileNames";
@"Video - H.264 + MP3 (MP4)",
@"Video - VP80 + Vorbis (Webm)",
@"Video - H.264 + MP3 (TS)",
- @"Video - Dirac + MP3 (TS)",
@"Video - Theora + Vorbis (OGG)",
@"Video - Theora + Flac (OGG)",
@"Video - MPEG-2 + MPGA (TS)",
=====================================
modules/stream_out/record.c
=====================================
@@ -284,7 +284,7 @@ static const muxer_properties_t p_muxers[] = {
//M( "avformat{mux=flac}", "flac", 1, VLC_CODEC_FLAC ), BROKEN
M( "ogg", "ogg", INT_MAX, VLC_CODEC_VORBIS, VLC_CODEC_SPEEX,
VLC_CODEC_FLAC,
- VLC_CODEC_SUBT, VLC_CODEC_THEORA,
VLC_CODEC_DIRAC,
+ VLC_CODEC_SUBT, VLC_CODEC_THEORA,
VLC_CODEC_OPUS ),
M( "asf", "asf", 127, VLC_CODEC_WMA1, VLC_CODEC_WMA2,
VLC_CODEC_WMAP, VLC_CODEC_WMAL, VLC_CODEC_WMAS,
=====================================
po/POTFILES.in
=====================================
@@ -313,7 +313,6 @@ modules/codec/png.c
modules/codec/qsv.c
modules/codec/rawvideo.c
modules/codec/rtpvideo.c
-modules/codec/schroedinger.c
modules/codec/scte18.c
modules/codec/scte18.h
modules/codec/scte27.c
=====================================
po/vlc.pot
=====================================
@@ -10067,7 +10067,6 @@ msgstr ""
#: modules/codec/avcodec/avcodec.c:147 modules/codec/jpeg.c:119
#: modules/codec/omxil/omxil.c:171 modules/codec/png.c:99
-#: modules/codec/schroedinger.c:370
msgid "Encoding"
msgstr ""
@@ -10540,11 +10539,11 @@ msgstr ""
msgid "Daala video encoder"
msgstr ""
-#: modules/codec/daala.c:143 modules/codec/schroedinger.c:54
+#: modules/codec/daala.c:143
msgid "Chroma format"
msgstr ""
-#: modules/codec/daala.c:144 modules/codec/schroedinger.c:55
+#: modules/codec/daala.c:144
msgid ""
"Picking chroma format will force a conversion of the video into that format"
msgstr ""
@@ -11343,377 +11342,6 @@ msgstr ""
msgid "Raw video encoder for RTP"
msgstr ""
-#: modules/codec/schroedinger.c:60
-msgid "4:2:0"
-msgstr ""
-
-#: modules/codec/schroedinger.c:60
-msgid "4:2:2"
-msgstr ""
-
-#: modules/codec/schroedinger.c:60
-msgid "4:4:4"
-msgstr ""
-
-#: modules/codec/schroedinger.c:63
-msgid "Rate control method"
-msgstr ""
-
-#: modules/codec/schroedinger.c:64
-msgid "Method used to encode the video sequence"
-msgstr ""
-
-#: modules/codec/schroedinger.c:77
-msgid "Constant noise threshold mode"
-msgstr ""
-
-#: modules/codec/schroedinger.c:78
-msgid "Constant bitrate mode (CBR)"
-msgstr ""
-
-#: modules/codec/schroedinger.c:79
-msgid "Low Delay mode"
-msgstr ""
-
-#: modules/codec/schroedinger.c:80
-msgid "Lossless mode"
-msgstr ""
-
-#: modules/codec/schroedinger.c:81
-msgid "Constant lambda mode"
-msgstr ""
-
-#: modules/codec/schroedinger.c:82
-msgid "Constant error mode"
-msgstr ""
-
-#: modules/codec/schroedinger.c:83
-msgid "Constant quality mode"
-msgstr ""
-
-#: modules/codec/schroedinger.c:87
-msgid "GOP structure"
-msgstr ""
-
-#: modules/codec/schroedinger.c:88
-msgid "GOP structure used to encode the video sequence"
-msgstr ""
-
-#: modules/codec/schroedinger.c:100
-msgid ""
-"No fixed gop structure. A picture can be intra or inter and refer to "
-"previous or future pictures."
-msgstr ""
-
-#: modules/codec/schroedinger.c:101
-msgid "I-frame only sequence"
-msgstr ""
-
-#: modules/codec/schroedinger.c:102 modules/codec/schroedinger.c:103
-msgid "Inter pictures refere to previous pictures only"
-msgstr ""
-
-#: modules/codec/schroedinger.c:104 modules/codec/schroedinger.c:105
-msgid "Inter pictures can refer to previous or future pictures"
-msgstr ""
-
-#: modules/codec/schroedinger.c:109
-msgid "Constant quality factor"
-msgstr ""
-
-#: modules/codec/schroedinger.c:110
-msgid "Quality factor to use in constant quality mode"
-msgstr ""
-
-#: modules/codec/schroedinger.c:113
-msgid "Noise Threshold"
-msgstr ""
-
-#: modules/codec/schroedinger.c:114
-msgid "Noise threshold to use in constant noise threshold mode"
-msgstr ""
-
-#: modules/codec/schroedinger.c:117
-msgid "CBR bitrate (kbps)"
-msgstr ""
-
-#: modules/codec/schroedinger.c:118
-msgid "Target bitrate in kbps when encoding in constant bitrate mode"
-msgstr ""
-
-#: modules/codec/schroedinger.c:121
-msgid "Maximum bitrate (kbps)"
-msgstr ""
-
-#: modules/codec/schroedinger.c:122
-msgid "Maximum bitrate in kbps when encoding in constant bitrate mode"
-msgstr ""
-
-#: modules/codec/schroedinger.c:125
-msgid "Minimum bitrate (kbps)"
-msgstr ""
-
-#: modules/codec/schroedinger.c:126
-msgid "Minimum bitrate in kbps when encoding in constant bitrate mode"
-msgstr ""
-
-#: modules/codec/schroedinger.c:129
-msgid "GOP length"
-msgstr ""
-
-#: modules/codec/schroedinger.c:130
-msgid ""
-"Number of pictures between successive sequence headers i.e. length of the "
-"group of pictures"
-msgstr ""
-
-#: modules/codec/schroedinger.c:134
-msgid "Prefilter"
-msgstr ""
-
-#: modules/codec/schroedinger.c:135
-msgid "Enable adaptive prefiltering"
-msgstr ""
-
-#: modules/codec/schroedinger.c:147
-msgid "No pre-filtering"
-msgstr ""
-
-#: modules/codec/schroedinger.c:148
-msgid "Centre Weighted Median"
-msgstr ""
-
-#: modules/codec/schroedinger.c:149
-msgid "Gaussian Low Pass Filter"
-msgstr ""
-
-#: modules/codec/schroedinger.c:150
-msgid "Add Noise"
-msgstr ""
-
-#: modules/codec/schroedinger.c:151
-msgid "Gaussian Adaptive Low Pass Filter"
-msgstr ""
-
-#: modules/codec/schroedinger.c:152
-msgid "Low Pass Filter"
-msgstr ""
-
-#: modules/codec/schroedinger.c:156
-msgid "Amount of prefiltering"
-msgstr ""
-
-#: modules/codec/schroedinger.c:157
-msgid "Higher value implies more prefiltering"
-msgstr ""
-
-#: modules/codec/schroedinger.c:160
-msgid "Picture coding mode"
-msgstr ""
-
-#: modules/codec/schroedinger.c:161
-msgid ""
-"Field coding is where interlaced fields are coded separately as opposed to a "
-"pseudo-progressive frame"
-msgstr ""
-
-#: modules/codec/schroedinger.c:166
-msgid "auto - let encoder decide based upon input (Best)"
-msgstr ""
-
-#: modules/codec/schroedinger.c:167
-msgid "force coding frame as single picture"
-msgstr ""
-
-#: modules/codec/schroedinger.c:168
-msgid "force coding frame as separate interlaced fields"
-msgstr ""
-
-#: modules/codec/schroedinger.c:173
-msgid "Size of motion compensation blocks"
-msgstr ""
-
-#: modules/codec/schroedinger.c:182 modules/codec/schroedinger.c:199
-#: modules/codec/schroedinger.c:297 modules/codec/schroedinger.c:338
-msgid "automatic - let encoder decide based upon input (Best)"
-msgstr ""
-
-#: modules/codec/schroedinger.c:183
-msgid "small - use small motion compensation blocks"
-msgstr ""
-
-#: modules/codec/schroedinger.c:184
-msgid "medium - use medium motion compensation blocks"
-msgstr ""
-
-#: modules/codec/schroedinger.c:185
-msgid "large - use large motion compensation blocks"
-msgstr ""
-
-#: modules/codec/schroedinger.c:190
-msgid "Overlap of motion compensation blocks"
-msgstr ""
-
-#: modules/codec/schroedinger.c:200
-msgid "none - Motion compensation blocks do not overlap"
-msgstr ""
-
-#: modules/codec/schroedinger.c:201
-msgid "partial - Motion compensation blocks only partially overlap"
-msgstr ""
-
-#: modules/codec/schroedinger.c:202
-msgid "full - Motion compensation blocks fully overlap"
-msgstr ""
-
-#: modules/codec/schroedinger.c:207
-msgid "Motion Vector precision"
-msgstr ""
-
-#: modules/codec/schroedinger.c:208
-msgid "Motion Vector precision in pels"
-msgstr ""
-
-#: modules/codec/schroedinger.c:214
-msgid "Three component motion estimation"
-msgstr ""
-
-#: modules/codec/schroedinger.c:215
-msgid "Use chroma as part of the motion estimation process"
-msgstr ""
-
-#: modules/codec/schroedinger.c:218
-msgid "Intra picture DWT filter"
-msgstr ""
-
-#: modules/codec/schroedinger.c:221
-msgid "Inter picture DWT filter"
-msgstr ""
-
-#: modules/codec/schroedinger.c:244
-msgid "Number of DWT iterations"
-msgstr ""
-
-#: modules/codec/schroedinger.c:245
-msgid "Also known as DWT levels"
-msgstr ""
-
-#: modules/codec/schroedinger.c:250
-msgid "Enable multiple quantizers"
-msgstr ""
-
-#: modules/codec/schroedinger.c:251
-msgid "Enable multiple quantizers per subband (one per codeblock)"
-msgstr ""
-
-#: modules/codec/schroedinger.c:255
-msgid "Disable arithmetic coding"
-msgstr ""
-
-#: modules/codec/schroedinger.c:256
-msgid "Use variable length codes instead, useful for very high bitrates"
-msgstr ""
-
-#: modules/codec/schroedinger.c:261
-msgid "perceptual weighting method"
-msgstr ""
-
-#: modules/codec/schroedinger.c:272
-msgid "perceptual distance"
-msgstr ""
-
-#: modules/codec/schroedinger.c:273
-msgid "perceptual distance to calculate perceptual weight"
-msgstr ""
-
-#: modules/codec/schroedinger.c:277
-msgid "Horizontal slices per frame"
-msgstr ""
-
-#: modules/codec/schroedinger.c:278
-msgid "Number of horizontal slices per frame in low delay mode"
-msgstr ""
-
-#: modules/codec/schroedinger.c:282
-msgid "Vertical slices per frame"
-msgstr ""
-
-#: modules/codec/schroedinger.c:283
-msgid "Number of vertical slices per frame in low delay mode"
-msgstr ""
-
-#: modules/codec/schroedinger.c:287
-msgid "Size of code blocks in each subband"
-msgstr ""
-
-#: modules/codec/schroedinger.c:298
-msgid "small - use small code blocks"
-msgstr ""
-
-#: modules/codec/schroedinger.c:299
-msgid "medium - use medium sized code blocks"
-msgstr ""
-
-#: modules/codec/schroedinger.c:300
-msgid "large - use large code blocks"
-msgstr ""
-
-#: modules/codec/schroedinger.c:301
-msgid "full - One code block per subband"
-msgstr ""
-
-#: modules/codec/schroedinger.c:306
-msgid "Enable hierarchical Motion Estimation"
-msgstr ""
-
-#: modules/codec/schroedinger.c:310
-msgid "Number of levels of downsampling"
-msgstr ""
-
-#: modules/codec/schroedinger.c:311
-msgid "Number of levels of downsampling in hierarchical motion estimation mode"
-msgstr ""
-
-#: modules/codec/schroedinger.c:315
-msgid "Enable Global Motion Estimation"
-msgstr ""
-
-#: modules/codec/schroedinger.c:319
-msgid "Enable Phase Correlation Estimation"
-msgstr ""
-
-#: modules/codec/schroedinger.c:323
-msgid "Enable Scene Change Detection"
-msgstr ""
-
-#: modules/codec/schroedinger.c:327
-msgid "Force Profile"
-msgstr ""
-
-#: modules/codec/schroedinger.c:339
-msgid "VC2 Low Delay Profile"
-msgstr ""
-
-#: modules/codec/schroedinger.c:340
-msgid "VC2 Simple Profile"
-msgstr ""
-
-#: modules/codec/schroedinger.c:341
-msgid "VC2 Main Profile"
-msgstr ""
-
-#: modules/codec/schroedinger.c:342
-msgid "Main Profile"
-msgstr ""
-
-#: modules/codec/schroedinger.c:363
-msgid "Dirac video decoder using libschroedinger"
-msgstr ""
-
-#: modules/codec/schroedinger.c:371
-msgid "Dirac video encoder using libschroedinger"
-msgstr ""
-
#: modules/codec/scte18.c:41
msgid "SCTE-18 decoder"
msgstr ""
@@ -14190,14 +13818,6 @@ msgstr ""
msgid "File dumper"
msgstr ""
-#: modules/demux/dirac.c:41
-msgid "Value to adjust dts by"
-msgstr ""
-
-#: modules/demux/dirac.c:54
-msgid "Dirac video demuxer"
-msgstr ""
-
#: modules/demux/directory.c:94
msgid "Directory import"
msgstr ""
@@ -22273,10 +21893,6 @@ msgstr ""
msgid "Copy packetizer"
msgstr ""
-#: modules/packetizer/dirac.c:87
-msgid "Dirac packetizer"
-msgstr ""
-
#: modules/packetizer/dts.c:47
msgid "DTS audio packetizer"
msgstr ""
View it on GitLab:
https://code.videolan.org/videolan/vlc/-/compare/1f9383c17987f597b64cb91b192e54ad4b1db82d...65e744b037de1e965b259f9bae2715924502862b
--
View it on GitLab:
https://code.videolan.org/videolan/vlc/-/compare/1f9383c17987f597b64cb91b192e54ad4b1db82d...65e744b037de1e965b259f9bae2715924502862b
You're receiving this email because of your account on code.videolan.org.
VideoLAN code repository instance_______________________________________________
vlc-commits mailing list
[email protected]
https://mailman.videolan.org/listinfo/vlc-commits