From a0cc9d1af004376cbedd8dd230712c69cd203517 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 1 Mar 2018 15:24:39 +0000 Subject: [PATCH] Remove schroedinger plugin No upstream (website disappeared), no maintainer, and pretty much a fringe format anyway. https://bugzilla.gnome.org/show_bug.cgi?id=776215 --- Makefile.am | 3 + configure.ac | 8 - .../gst-plugins-bad-plugins-sections.txt | 32 - docs/plugins/gst-plugins-bad-plugins.args | 760 ----------------- .../plugins/gst-plugins-bad-plugins.hierarchy | 2 - .../gst-plugins-bad-plugins.interfaces | 1 - docs/plugins/inspect/plugin-schro.xml | 55 -- ext/Makefile.am | 8 - ext/meson.build | 1 - ext/schroedinger/Makefile.am | 24 - ext/schroedinger/gstschro.c | 51 -- ext/schroedinger/gstschrodec.c | 595 ------------- ext/schroedinger/gstschroenc.c | 795 ------------------ ext/schroedinger/gstschroutils.c | 224 ----- ext/schroedinger/gstschroutils.h | 45 - ext/schroedinger/meson.build | 20 - meson.build | 1 - tests/check/Makefile.am | 7 - tests/check/elements/.gitignore | 1 - tests/check/elements/schroenc.c | 177 ---- tests/check/meson.build | 1 - 21 files changed, 3 insertions(+), 2808 deletions(-) delete mode 100644 docs/plugins/inspect/plugin-schro.xml delete mode 100644 ext/schroedinger/Makefile.am delete mode 100644 ext/schroedinger/gstschro.c delete mode 100644 ext/schroedinger/gstschrodec.c delete mode 100644 ext/schroedinger/gstschroenc.c delete mode 100644 ext/schroedinger/gstschroutils.c delete mode 100644 ext/schroedinger/gstschroutils.h delete mode 100644 ext/schroedinger/meson.build delete mode 100644 tests/check/elements/schroenc.c diff --git a/Makefile.am b/Makefile.am index ba35588203..0783edf780 100644 --- a/Makefile.am +++ b/Makefile.am @@ -62,6 +62,7 @@ CRUFT_FILES = \ $(top_builddir)/gst/opus/.libs/libgstopus.{so,dll,DLL,dylib} \ $(top_builddir)/ext/mpg123/.libs/*.{so,dll,DLL,dylib} \ $(top_builddir)/ext/qt/.libs/*.{so,dll,DLL,dylib} \ + $(top_builddir)/ext/schroedinger/.libs/*.{so,dll,DLL,dylib} \ $(top_builddir)/gst/aacparse/.libs/*.{so,dll,DLL,dylib} \ $(top_builddir)/gst/amrparse/.libs/*.{so,dll,DLL,dylib} \ $(top_builddir)/gst/audiomixer/.libs/*.{so,dll,DLL,dylib} \ @@ -92,6 +93,7 @@ CRUFT_FILES = \ $(top_builddir)/tests/check/elements/rawaudioparse \ $(top_builddir)/tests/check/elements/rawvideoparse \ $(top_builddir)/tests/check/elements/rtpmux \ + $(top_builddir)/tests/check/elements/schroenc \ $(top_builddir)/tests/check/elements/selector \ $(top_builddir)/tests/check/elements/valve \ $(top_builddir)/tests/check/pipelines/metadata \ @@ -148,6 +150,7 @@ CRUFT_DIRS = \ $(top_srcdir)/ext/mimic \ $(top_srcdir)/ext/mpg123 \ $(top_srcdir)/ext/qt \ + $(top_srcdir)/ext/schroedinger \ $(top_srcdir)/ext/swfdec \ $(top_srcdir)/ext/tarkin \ $(top_srcdir)/ext/theora \ diff --git a/configure.ac b/configure.ac index 8e7304bdca..d41cf64004 100644 --- a/configure.ac +++ b/configure.ac @@ -2178,12 +2178,6 @@ AG_GST_CHECK_FEATURE(SBC, [SBC bluetooth audio codec], sbc, [ AG_GST_PKG_CHECK_MODULES(SBC, [sbc >= 1.0]) ]) -dnl *** schroedinger *** -translit(dnm, m, l) AM_CONDITIONAL(USE_SCHRO, true) -AG_GST_CHECK_FEATURE(SCHRO, [Schroedinger video codec], schro, [ - AG_GST_PKG_CHECK_MODULES(SCHRO, schroedinger-1.0 >= 1.0.10) -]) - dnl *** zbar *** translit(dnm, m, l) AM_CONDITIONAL(USE_ZBAR, true) AG_GST_CHECK_FEATURE(ZBAR, [ZBar barcode detector], zbar, [ @@ -2376,7 +2370,6 @@ AM_CONDITIONAL(USE_DVB, false) AM_CONDITIONAL(USE_ACM, false) AM_CONDITIONAL(USE_VDPAU, false) AM_CONDITIONAL(USE_SBC, false) -AM_CONDITIONAL(USE_SCHRO, false) AM_CONDITIONAL(USE_ZBAR, false) AM_CONDITIONAL(USE_RSVG, false) AM_CONDITIONAL(USE_RTMP, false) @@ -2663,7 +2656,6 @@ ext/rsvg/Makefile ext/resindvd/Makefile ext/rtmp/Makefile ext/sbc/Makefile -ext/schroedinger/Makefile ext/smoothstreaming/Makefile ext/sndfile/Makefile ext/soundtouch/Makefile diff --git a/docs/plugins/gst-plugins-bad-plugins-sections.txt b/docs/plugins/gst-plugins-bad-plugins-sections.txt index 558dff627a..fc429cd6de 100644 --- a/docs/plugins/gst-plugins-bad-plugins-sections.txt +++ b/docs/plugins/gst-plugins-bad-plugins-sections.txt @@ -3168,38 +3168,6 @@ GST_TYPE_SCENE_CHANGE gst_scene_change_get_type -
-element-schrodec -schrodec -GstSchroDec - -GstSchroDecClass -GST_SCHRO_DEC -GST_SCHRO_DEC_CAST -GST_IS_SCHRO_DEC -GST_SCHRO_DEC_CLASS -GST_IS_SCHRO_DEC_CLASS -GST_TYPE_SCHRO_DEC - -gst_schro_dec_get_type -
- -
-element-schroenc -schroenc -GstSchroEnc - -GstSchroEncClass -GST_SCHRO_ENC -GST_SCHRO_ENC_CAST -GST_IS_SCHRO_ENC -GST_SCHRO_ENC_CLASS -GST_IS_SCHRO_ENC_CLASS -GST_TYPE_SCHRO_ENC - -gst_schro_enc_get_type -
-
element-sdpsrc sdpsrc diff --git a/docs/plugins/gst-plugins-bad-plugins.args b/docs/plugins/gst-plugins-bad-plugins.args index 5ecb3401a2..90c7b99dd8 100644 --- a/docs/plugins/gst-plugins-bad-plugins.args +++ b/docs/plugins/gst-plugins-bad-plugins.args @@ -28508,756 +28508,6 @@ 1 - -GstSchroEnc::au-distance -gint ->= 1 -rw -au_distance -au_distance. -120 - - - -GstSchroEnc::bitrate -gint ->= 0 -rw -bitrate -bitrate. -0 - - - -GstSchroEnc::buffer-level -gint ->= 0 -rw -buffer_level -buffer_level. -0 - - - -GstSchroEnc::buffer-size -gint ->= 0 -rw -buffer_size -buffer_size. -0 - - - -GstSchroEnc::enable-bigblock-estimation -gboolean - -rw -enable_bigblock_estimation -enable_bigblock_estimation. -TRUE - - - -GstSchroEnc::enable-dc-multiquant -gboolean - -rw -enable_dc_multiquant -enable_dc_multiquant. -FALSE - - - -GstSchroEnc::enable-fullscan-estimation -gboolean - -rw -enable_fullscan_estimation -enable_fullscan_estimation. -FALSE - - - -GstSchroEnc::enable-global-motion -gboolean - -rw -enable_global_motion -enable_global_motion. -FALSE - - - -GstSchroEnc::enable-hierarchical-estimation -gboolean - -rw -enable_hierarchical_estimation -enable_hierarchical_estimation. -TRUE - - - -GstSchroEnc::enable-internal-testing -gboolean - -rw -enable_internal_testing -enable_internal_testing. -FALSE - - - -GstSchroEnc::enable-md5 -gboolean - -rw -enable_md5 -enable_md5. -FALSE - - - -GstSchroEnc::enable-multiquant -gboolean - -rw -enable_multiquant -enable_multiquant. -FALSE - - - -GstSchroEnc::enable-noarith -gboolean - -rw -enable_noarith -enable_noarith. -FALSE - - - -GstSchroEnc::enable-phasecorr-estimation -gboolean - -rw -enable_phasecorr_estimation -enable_phasecorr_estimation. -FALSE - - - -GstSchroEnc::enable-psnr -gboolean - -rw -enable_psnr -enable_psnr. -FALSE - - - -GstSchroEnc::enable-ssim -gboolean - -rw -enable_ssim -enable_ssim. -FALSE - - - -GstSchroEnc::enable-zero-estimation -gboolean - -rw -enable_zero_estimation -enable_zero_estimation. -FALSE - - - -GstSchroEnc::filter-value -gdouble -[0,100] -rw -filter_value -filter_value. -5 - - - -GstSchroEnc::filtering -SchroEncoderSettingEnum_filtering - -rw -filtering -filtering. -none - - - -GstSchroEnc::gop-structure -SchroEncoderSettingEnum_gop_structure - -rw -gop_structure -gop_structure. -adaptive - - - -GstSchroEnc::horiz-slices -gint ->= 0 -rw -horiz_slices -horiz_slices. -0 - - - -GstSchroEnc::inter-wavelet -SchroEncoderSettingEnum_inter_wavelet - -rw -inter_wavelet -inter_wavelet. -desl-dubuc-9-7 - - - -GstSchroEnc::interlaced-coding -gboolean - -rw -interlaced_coding -interlaced_coding. -FALSE - - - -GstSchroEnc::intra-wavelet -SchroEncoderSettingEnum_intra_wavelet - -rw -intra_wavelet -intra_wavelet. -desl-dubuc-9-7 - - - -GstSchroEnc::level -gint -[0,0] -rw -level -level. -0 - - - -GstSchroEnc::magic-allocation-scale -gdouble -[0,1000] -rw -magic_allocation_scale -magic_allocation_scale. -1.1 - - - -GstSchroEnc::magic-badblock-multiplier-nonref -gdouble -[0,1000] -rw -magic_badblock_multiplier_nonref -magic_badblock_multiplier_nonref. -4 - - - -GstSchroEnc::magic-badblock-multiplier-ref -gdouble -[0,1000] -rw -magic_badblock_multiplier_ref -magic_badblock_multiplier_ref. -8 - - - -GstSchroEnc::magic-bailout-weight -gdouble -[0,1000] -rw -magic_bailout_weight -magic_bailout_weight. -4 - - - -GstSchroEnc::magic-block-search-threshold -gdouble -[0,1000] -rw -magic_block_search_threshold -magic_block_search_threshold. -15 - - - -GstSchroEnc::magic-chroma-lambda-scale -gdouble -[0,1000] -rw -magic_chroma_lambda_scale -magic_chroma_lambda_scale. -0.1 - - - -GstSchroEnc::magic-dc-metric-offset -gdouble -[0,1000] -rw -magic_dc_metric_offset -magic_dc_metric_offset. -1 - - - -GstSchroEnc::magic-error-power -gdouble -[0,1000] -rw -magic_error_power -magic_error_power. -4 - - - -GstSchroEnc::magic-inter-b-weight -gdouble -[0,1000] -rw -magic_inter_b_weight -magic_inter_b_weight. -0.2 - - - -GstSchroEnc::magic-inter-p-weight -gdouble -[0,1000] -rw -magic_inter_p_weight -magic_inter_p_weight. -1.5 - - - -GstSchroEnc::magic-keyframe-weight -gdouble -[0,1000] -rw -magic_keyframe_weight -magic_keyframe_weight. -7.5 - - - -GstSchroEnc::magic-lambda -gdouble -[0,1000] -rw -magic_lambda -magic_lambda. -1 - - - -GstSchroEnc::magic-mc-bailout-limit -gdouble -[0,1000] -rw -magic_mc_bailout_limit -magic_mc_bailout_limit. -0.5 - - - -GstSchroEnc::magic-mc-lambda -gdouble -[0,1000] -rw -magic_mc_lambda -magic_mc_lambda. -0.1 - - - -GstSchroEnc::magic-nonref-lambda-scale -gdouble -[0,1000] -rw -magic_nonref_lambda_scale -magic_nonref_lambda_scale. -0.01 - - - -GstSchroEnc::magic-scene-change-threshold -gdouble -[0,1000] -rw -magic_scene_change_threshold -magic_scene_change_threshold. -3 - - - -GstSchroEnc::magic-subband0-lambda-scale -gdouble -[0,1000] -rw -magic_subband0_lambda_scale -magic_subband0_lambda_scale. -10 - - - -GstSchroEnc::magic-subgroup-length -gdouble -[1,10] -rw -magic_subgroup_length -magic_subgroup_length. -4 - - - -GstSchroEnc::max-bitrate -gint ->= 0 -rw -max_bitrate -max_bitrate. -13824000 - - - -GstSchroEnc::min-bitrate -gint ->= 0 -rw -min_bitrate -min_bitrate. -13824000 - - - -GstSchroEnc::motion-block-overlap -SchroEncoderSettingEnum_motion_block_overlap - -rw -motion_block_overlap -motion_block_overlap. -automatic - - - -GstSchroEnc::motion-block-size -SchroEncoderSettingEnum_motion_block_size - -rw -motion_block_size -motion_block_size. -automatic - - - -GstSchroEnc::mv-precision -gint -[0,3] -rw -mv_precision -mv_precision. -0 - - - -GstSchroEnc::noise-threshold -gdouble -[0,100] -rw -noise_threshold -noise_threshold. -25 - - - -GstSchroEnc::open-gop -gboolean - -rw -open_gop -open_gop. -TRUE - - - -GstSchroEnc::perceptual-distance -gdouble -[0,100] -rw -perceptual_distance -perceptual_distance. -4 - - - -GstSchroEnc::perceptual-weighting -SchroEncoderSettingEnum_perceptual_weighting - -rw -perceptual_weighting -perceptual_weighting. -ccir959 - - - -GstSchroEnc::profile -gint -[0,0] -rw -profile -profile. -0 - - - -GstSchroEnc::quality -gdouble -[0,10] -rw -quality -quality. -5 - - - -GstSchroEnc::queue-depth -gint -[1,40] -rw -queue_depth -queue_depth. -20 - - - -GstSchroEnc::rate-control -SchroEncoderSettingEnum_rate_control - -rw -rate_control -rate_control. -constant-quality - - - -GstSchroEnc::ref-distance -gint -[2,20] -rw -ref_distance -ref_distance. -4 - - - -GstSchroEnc::transform-depth -gint -[0,6] -rw -transform_depth -transform_depth. -3 - - - -GstSchroEnc::vert-slices -gint ->= 0 -rw -vert_slices -vert_slices. -0 - - - -GstSchroEnc::codeblock-size -SchroEncoderSettingEnum_codeblock_size - -rw -codeblock_size -codeblock_size. -automatic - - - -GstSchroEnc::magic-scan-distance -gdouble -[0,1000] -rw -magic_scan_distance -magic_scan_distance. -4 - - - -GstSchroEnc::downsample-levels -gint -[2,8] -rw -downsample_levels -downsample_levels. -5 - - - -GstSchroEnc::enable-chroma-me -gboolean - -rw -enable_chroma_me -enable_chroma_me. -FALSE - - - -GstSchroEnc::enable-deep-estimation -gboolean - -rw -enable_deep_estimation -enable_deep_estimation. -TRUE - - - -GstSchroEnc::enable-rdo-cbr -gboolean - -rw -enable_rdo_cbr -enable_rdo_cbr. -TRUE - - - -GstSchroEnc::enable-scene-change-detection -gboolean - -rw -enable_scene_change_detection -enable_scene_change_detection. -TRUE - - - -GstSchroEnc::force-profile -SchroEncoderSettingEnum_force_profile - -rw -force_profile -force_profile. -auto - - - -GstSchroEnc::magic-B-lambda-scale -gdouble -[0,10] -rw -magic_B_lambda_scale -magic_B_lambda_scale. -0.01 - - - -GstSchroEnc::magic-I-lambda-scale -gdouble -[0,100] -rw -magic_I_lambda_scale -magic_I_lambda_scale. -1 - - - -GstSchroEnc::magic-P-lambda-scale -gdouble -[0,10] -rw -magic_P_lambda_scale -magic_P_lambda_scale. -0.25 - - - -GstSchroEnc::magic-diagonal-lambda-scale -gdouble -[0,1000] -rw -magic_diagonal_lambda_scale -magic_diagonal_lambda_scale. -1 - - - -GstSchroEnc::magic-inter-cpd-scale -gdouble -[0,1] -rw -magic_inter_cpd_scale -magic_inter_cpd_scale. -1 - - - -GstSchroEnc::magic-me-bailout-limit -gdouble -[0,1000] -rw -magic_me_bailout_limit -magic_me_bailout_limit. -0.33 - - - -GstSchroEnc::magic-me-lambda-scale -gdouble -[0,100] -rw -magic_me_lambda_scale -magic_me_lambda_scale. -1 - - - -GstSchroEnc::max-refs -gint -[1,4] -rw -max_refs -max_refs. -3 - - GstAmrWbEnc::band-mode GstAmrWbEncBandMode @@ -29268,16 +28518,6 @@ MR660 - -GstMimEnc::paused-mode -gboolean - -rw -Paused mode -If enabled, empty frames will be generated every 4 seconds when no data is received. -FALSE - - GstPnmenc::ascii gboolean diff --git a/docs/plugins/gst-plugins-bad-plugins.hierarchy b/docs/plugins/gst-plugins-bad-plugins.hierarchy index 19c2046f00..5b18e98cd2 100644 --- a/docs/plugins/gst-plugins-bad-plugins.hierarchy +++ b/docs/plugins/gst-plugins-bad-plugins.hierarchy @@ -305,7 +305,6 @@ GObject GstOpenh264Dec GstPnmdec GstRsvgDec - GstSchroDec GstVMncDec GstVdpDecoder GstVdpMpegDec @@ -314,7 +313,6 @@ GObject GstOpenJPEGEnc GstOpenh264Enc GstPnmenc - GstSchroEnc GstWebpEnc GstX265Enc GstVideoFrameAudioLevel diff --git a/docs/plugins/gst-plugins-bad-plugins.interfaces b/docs/plugins/gst-plugins-bad-plugins.interfaces index a122096090..85a2be1dfb 100644 --- a/docs/plugins/gst-plugins-bad-plugins.interfaces +++ b/docs/plugins/gst-plugins-bad-plugins.interfaces @@ -85,7 +85,6 @@ GstRTMPSrc GstURIHandler GstSDLVideoSink GstImplementsInterface GstXOverlay GstNavigation GstSDPDemux GstChildProxy GstSbcEnc GstPreset -GstSchroEnc GstPreset GstSdpSrc GstChildProxy GstURIHandler GstSirenEnc GstPreset GstTagMux GstTagSetter diff --git a/docs/plugins/inspect/plugin-schro.xml b/docs/plugins/inspect/plugin-schro.xml deleted file mode 100644 index 774335d9b0..0000000000 --- a/docs/plugins/inspect/plugin-schro.xml +++ /dev/null @@ -1,55 +0,0 @@ - - schro - Schroedinger plugin - ../../ext/schroedinger/.libs/libgstschro.so - libgstschro.so - 1.13.1.1 - LGPL - gst-plugins-bad - GStreamer Bad Plug-ins git - Unknown package origin - - - schrodec - Dirac Decoder - Codec/Decoder/Video - Decode Dirac streams - David Schleef <ds@schleef.org> - - - sink - sink - always -
video/x-dirac
-
- - src - source - always -
video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, Y42B, Y444, v216, v210, AY64 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
-
-
-
- - schroenc - Dirac Encoder - Codec/Encoder/Video - Encode raw video into Dirac stream - David Schleef <ds@schleef.org> - - - sink - sink - always -
video/x-raw, format=(string){ I420, YV12, YUY2, UYVY, AYUV, Y42B, Y444, v216, v210, AY64 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
-
- - src - source - always -
video/x-dirac; video/x-qt-part; video/x-mp4-part
-
-
-
-
-
\ No newline at end of file diff --git a/ext/Makefile.am b/ext/Makefile.am index 1125f2effd..4de92141dd 100644 --- a/ext/Makefile.am +++ b/ext/Makefile.am @@ -280,12 +280,6 @@ else SBC_DIR= endif -if USE_SCHRO -SCHRO_DIR=schroedinger -else -SCHRO_DIR= -endif - if USE_SMOOTHSTREAMING SMOOTHSTREAMING_DIR = smoothstreaming else @@ -454,7 +448,6 @@ SUBDIRS=\ $(OPUS_DIR) \ $(RSVG_DIR) \ $(SBC_DIR) \ - $(SCHRO_DIR) \ $(SMOOTHSTREAMING_DIR) \ $(SMOOTHWAVE_DIR) \ $(SNDFILE_DIR) \ @@ -522,7 +515,6 @@ DIST_SUBDIRS = \ rsvg \ resindvd \ sbc \ - schroedinger \ smoothstreaming \ sndfile \ soundtouch \ diff --git a/ext/meson.build b/ext/meson.build index b9c243f0b6..cd193b7b3d 100644 --- a/ext/meson.build +++ b/ext/meson.build @@ -42,7 +42,6 @@ subdir('resindvd') subdir('rsvg') subdir('rtmp') subdir('sbc') -subdir('schroedinger') subdir('smoothstreaming') #subdir('sndfile') if cc.get_id() != 'msvc' diff --git a/ext/schroedinger/Makefile.am b/ext/schroedinger/Makefile.am deleted file mode 100644 index 92f95df093..0000000000 --- a/ext/schroedinger/Makefile.am +++ /dev/null @@ -1,24 +0,0 @@ - -plugin_LTLIBRARIES = libgstschro.la - -noinst_HEADERS = \ - gstschroutils.h - -libgstschro_la_SOURCES = \ - gstschro.c \ - gstschrodec.c \ - gstschroenc.c \ - gstschroutils.c -libgstschro_la_CFLAGS = \ - $(GST_PLUGINS_BASE_CFLAGS) \ - $(GST_BASE_CFLAGS) \ - $(GST_CFLAGS) \ - -DGST_USE_UNSTABLE_API \ - $(SCHRO_CFLAGS) -libgstschro_la_LIBADD = \ - $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_API_VERSION@ \ - $(GST_BASE_LIBS) $(GST_LIBS) \ - $(SCHRO_LIBS) -libgstschro_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) - - diff --git a/ext/schroedinger/gstschro.c b/ext/schroedinger/gstschro.c deleted file mode 100644 index 919536aecb..0000000000 --- a/ext/schroedinger/gstschro.c +++ /dev/null @@ -1,51 +0,0 @@ -/* GStreamer - * Copyright (C) 2005 David Schleef - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include - -GType gst_schro_enc_get_type (void); -GType gst_schro_dec_get_type (void); - -GST_DEBUG_CATEGORY (schro_debug); -#define GST_CAT_DEFAULT schro_debug - -static gboolean -plugin_init (GstPlugin * plugin) -{ - schro_init (); - - GST_DEBUG_CATEGORY_INIT (schro_debug, "schro", 0, "Schroedinger"); - gst_element_register (plugin, "schrodec", GST_RANK_PRIMARY, - gst_schro_dec_get_type ()); - gst_element_register (plugin, "schroenc", GST_RANK_PRIMARY, - gst_schro_enc_get_type ()); - - return TRUE; -} - -GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, - GST_VERSION_MINOR, - schro, - "Schroedinger plugin", - plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/ext/schroedinger/gstschrodec.c b/ext/schroedinger/gstschrodec.c deleted file mode 100644 index bafd359225..0000000000 --- a/ext/schroedinger/gstschrodec.c +++ /dev/null @@ -1,595 +0,0 @@ -/* Schrodinger - * Copyright (C) 2006 David Schleef - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "gstschroutils.h" - -#include - -GST_DEBUG_CATEGORY_EXTERN (schro_debug); -#define GST_CAT_DEFAULT schro_debug - -#define GST_TYPE_SCHRO_DEC \ - (gst_schro_dec_get_type()) -#define GST_SCHRO_DEC(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SCHRO_DEC,GstSchroDec)) -#define GST_SCHRO_DEC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SCHRO_DEC,GstSchroDecClass)) -#define GST_IS_SCHRO_DEC(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SCHRO_DEC)) -#define GST_IS_SCHRO_DEC_CLASS(obj) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SCHRO_DEC)) - -typedef struct _GstSchroDec GstSchroDec; -typedef struct _GstSchroDecClass GstSchroDecClass; - -struct _GstSchroDec -{ - GstVideoDecoder base_video_decoder; - - SchroDecoder *decoder; - - gboolean seq_header_buffer_seen; - gint next; - gint prev; - gint parse_code; - gboolean header_read; -}; - -struct _GstSchroDecClass -{ - GstVideoDecoderClass base_video_decoder_class; -}; - -GType gst_schro_dec_get_type (void); - - -/* GstSchroDec signals and args */ -enum -{ - LAST_SIGNAL -}; - -enum -{ - ARG_0 -}; - -static void gst_schro_dec_finalize (GObject * object); - -static gboolean gst_schro_dec_start (GstVideoDecoder * dec); -static gboolean gst_schro_dec_stop (GstVideoDecoder * dec); -static gboolean gst_schro_dec_flush (GstVideoDecoder * dec); -static GstFlowReturn gst_schro_dec_parse (GstVideoDecoder * - base_video_decoder, GstVideoCodecFrame * frame, GstAdapter * adapter, - gboolean at_eos); -static GstFlowReturn gst_schro_dec_handle_frame (GstVideoDecoder * decoder, - GstVideoCodecFrame * frame); -static GstFlowReturn gst_schro_dec_finish (GstVideoDecoder * base_video_decoder); -static void gst_schrodec_send_tags (GstSchroDec * schro_dec); -static gboolean gst_schro_dec_decide_allocation (GstVideoDecoder * decoder, - GstQuery * query); - -static GstStaticPadTemplate gst_schro_dec_sink_template = -GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-dirac") - ); - -static GstStaticPadTemplate gst_schro_dec_src_template = -GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (GST_SCHRO_YUV_LIST)) - ); - -#define parent_class gst_schro_dec_parent_class -G_DEFINE_TYPE (GstSchroDec, gst_schro_dec, GST_TYPE_VIDEO_DECODER); - -static void -gst_schro_dec_class_init (GstSchroDecClass * klass) -{ - GObjectClass *gobject_class; - GstElementClass *element_class; - GstVideoDecoderClass *base_video_decoder_class; - - gobject_class = G_OBJECT_CLASS (klass); - element_class = GST_ELEMENT_CLASS (klass); - base_video_decoder_class = GST_VIDEO_DECODER_CLASS (klass); - - gobject_class->finalize = gst_schro_dec_finalize; - - gst_element_class_add_static_pad_template (element_class, - &gst_schro_dec_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_schro_dec_sink_template); - - gst_element_class_set_static_metadata (element_class, "Dirac Decoder", - "Codec/Decoder/Video", - "Decode Dirac streams", "David Schleef "); - - base_video_decoder_class->start = GST_DEBUG_FUNCPTR (gst_schro_dec_start); - base_video_decoder_class->stop = GST_DEBUG_FUNCPTR (gst_schro_dec_stop); - base_video_decoder_class->flush = GST_DEBUG_FUNCPTR (gst_schro_dec_flush); - base_video_decoder_class->parse = GST_DEBUG_FUNCPTR (gst_schro_dec_parse); - base_video_decoder_class->handle_frame = - GST_DEBUG_FUNCPTR (gst_schro_dec_handle_frame); - base_video_decoder_class->finish = GST_DEBUG_FUNCPTR (gst_schro_dec_finish); - base_video_decoder_class->decide_allocation = - GST_DEBUG_FUNCPTR (gst_schro_dec_decide_allocation); -} - -static void -gst_schro_dec_init (GstSchroDec * schro_dec) -{ - GST_DEBUG ("gst_schro_dec_init"); - - schro_dec->decoder = schro_decoder_new (); - gst_video_decoder_set_packetized (GST_VIDEO_DECODER (schro_dec), FALSE); - gst_video_decoder_set_use_default_pad_acceptcaps (GST_VIDEO_DECODER_CAST - (schro_dec), TRUE); - GST_PAD_SET_ACCEPT_TEMPLATE (GST_VIDEO_DECODER_SINK_PAD (schro_dec)); - schro_dec->header_read = FALSE; -} - -static gboolean -gst_schro_dec_start (GstVideoDecoder * dec) -{ - - return TRUE; -} - -static gboolean -gst_schro_dec_stop (GstVideoDecoder * dec) -{ - GstSchroDec *schro_dec; - - schro_dec = GST_SCHRO_DEC (dec); - - schro_dec->header_read = FALSE; - return TRUE; -} - -static gboolean -gst_schro_dec_flush (GstVideoDecoder * dec) -{ - GstSchroDec *schro_dec; - - schro_dec = GST_SCHRO_DEC (dec); - - GST_DEBUG ("flush"); - - if (schro_dec->decoder) - schro_decoder_reset (schro_dec->decoder); - schro_dec->header_read = FALSE; - return TRUE; -} - -static void -gst_schro_dec_finalize (GObject * object) -{ - GstSchroDec *schro_dec; - - g_return_if_fail (GST_IS_SCHRO_DEC (object)); - schro_dec = GST_SCHRO_DEC (object); - - if (schro_dec->decoder) { - schro_decoder_free (schro_dec->decoder); - schro_dec->decoder = NULL; - } - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -static void -parse_sequence_header (GstSchroDec * schro_dec, guint8 * data, int size) -{ - SchroVideoFormat video_format; - int ret; - GstVideoCodecState *state = NULL; - int bit_depth; - GstVideoFormat fmt = GST_VIDEO_FORMAT_UNKNOWN; - - GST_DEBUG_OBJECT (schro_dec, "parse_sequence_header size=%d", size); - - schro_dec->seq_header_buffer_seen = TRUE; - - ret = schro_parse_decode_sequence_header (data + 13, size - 13, - &video_format); - if (!ret) { - /* FIXME : Isn't this meant to be a *fatal* error ? */ - GST_WARNING ("Failed to get frame rate from sequence header"); - goto beach; - } -#if SCHRO_CHECK_VERSION(1,0,11) - bit_depth = schro_video_format_get_bit_depth (&video_format); -#else - bit_depth = 8; -#endif - - if (bit_depth == 8) { - if (video_format.chroma_format == SCHRO_CHROMA_444) { - fmt = GST_VIDEO_FORMAT_AYUV; - } else if (video_format.chroma_format == SCHRO_CHROMA_422) { - fmt = GST_VIDEO_FORMAT_UYVY; - } else if (video_format.chroma_format == SCHRO_CHROMA_420) { - fmt = GST_VIDEO_FORMAT_I420; - } -#if SCHRO_CHECK_VERSION(1,0,11) - } else if (bit_depth <= 10) { - if (video_format.colour_matrix == SCHRO_COLOUR_MATRIX_REVERSIBLE) { - fmt = GST_VIDEO_FORMAT_ARGB; - } else { - fmt = GST_VIDEO_FORMAT_v210; - } - } else if (bit_depth <= 16) { - fmt = GST_VIDEO_FORMAT_AYUV64; - } else { - GST_ERROR ("bit depth too large (%d > 16)", bit_depth); - fmt = GST_VIDEO_FORMAT_AYUV64; -#endif - } - - state = gst_video_decoder_set_output_state (GST_VIDEO_DECODER (schro_dec), - fmt, video_format.width, video_format.height, NULL); - - GST_DEBUG ("Frame dimensions are %d x %d\n", state->info.width, - state->info.height); - - state->info.fps_n = video_format.frame_rate_numerator; - state->info.fps_d = video_format.frame_rate_denominator; - GST_DEBUG_OBJECT (schro_dec, "Frame rate is %d/%d", state->info.fps_n, - state->info.fps_d); - - state->info.par_n = video_format.aspect_ratio_numerator; - state->info.par_d = video_format.aspect_ratio_denominator; - GST_DEBUG ("Pixel aspect ratio is %d/%d", state->info.par_n, - state->info.par_d); - - gst_video_decoder_negotiate (GST_VIDEO_DECODER (schro_dec)); - -beach: - if (state) - gst_video_codec_state_unref (state); - gst_schrodec_send_tags (schro_dec); -} - - -static GstFlowReturn -gst_schro_dec_parse (GstVideoDecoder * base_video_decoder, - GstVideoCodecFrame * frame, GstAdapter * adapter, gboolean at_eos) -{ - GstSchroDec *schro_decoder; - unsigned char header[SCHRO_PARSE_HEADER_SIZE]; - int av, loc; - - GST_DEBUG_OBJECT (base_video_decoder, "parse"); - - schro_decoder = GST_SCHRO_DEC (base_video_decoder); - av = gst_adapter_available (adapter); - - if (av < SCHRO_PARSE_HEADER_SIZE) { - return GST_VIDEO_DECODER_FLOW_NEED_DATA; - } - - GST_DEBUG ("available %d", av); - - /* Check for header */ - if (schro_decoder->header_read == FALSE) { - /* Check for header */ - loc = - gst_adapter_masked_scan_uint32 (adapter, 0xffffffff, 0x42424344, 0, - av - (SCHRO_PARSE_HEADER_SIZE - 1)); - if (G_UNLIKELY (loc == -1)) { - GST_DEBUG_OBJECT (schro_decoder, "No header"); - gst_adapter_flush (adapter, av - (SCHRO_PARSE_HEADER_SIZE - 1)); - return GST_VIDEO_DECODER_FLOW_NEED_DATA; - } - - /* Skip data until header */ - if (loc > 0) - gst_adapter_flush (adapter, loc); - - gst_adapter_copy (adapter, header, 0, SCHRO_PARSE_HEADER_SIZE); - - schro_decoder->parse_code = header[4]; - schro_decoder->next = GST_READ_UINT32_BE (header + 5); - schro_decoder->prev = GST_READ_UINT32_BE (header + 9); - - GST_DEBUG ("%08x %02x %08x %08x", - GST_READ_UINT32_BE (header), schro_decoder->parse_code, - schro_decoder->next, schro_decoder->prev); - - if (memcmp (header, "BBCD", 4) != 0 || (schro_decoder->next & 0xf0000000) - || (schro_decoder->prev & 0xf0000000)) { - gst_adapter_flush (adapter, 1); - return GST_VIDEO_DECODER_FLOW_NEED_DATA; - } - schro_decoder->header_read = TRUE; - } - if (SCHRO_PARSE_CODE_IS_END_OF_SEQUENCE (schro_decoder->parse_code)) { - if (schro_decoder->next != 0 - && schro_decoder->next != SCHRO_PARSE_HEADER_SIZE) { - GST_WARNING ("next is not 0 or 13 in EOS packet (%d)", - schro_decoder->next); - } - - gst_video_decoder_add_to_frame (base_video_decoder, - SCHRO_PARSE_HEADER_SIZE); - - SCHRO_DEBUG ("eos"); - schro_decoder->header_read = FALSE; - return gst_video_decoder_have_frame (base_video_decoder); - } - - if (gst_adapter_available (adapter) < schro_decoder->next) { - return GST_VIDEO_DECODER_FLOW_NEED_DATA; - } else - schro_decoder->header_read = FALSE; - - if (SCHRO_PARSE_CODE_IS_SEQ_HEADER (schro_decoder->parse_code)) { - guint8 *data; - - data = g_malloc (schro_decoder->next); - - gst_adapter_copy (adapter, data, 0, schro_decoder->next); - parse_sequence_header (schro_decoder, data, schro_decoder->next); - - GST_VIDEO_CODEC_FRAME_SET_SYNC_POINT (frame); - -#if 0 - if (GST_CLOCK_TIME_IS_VALID (base_video_decoder->last_sink_timestamp)) { - base_video_decoder->current_frame->pts = - base_video_decoder->last_sink_timestamp; - GST_DEBUG ("got timestamp %" G_GINT64_FORMAT, - base_video_decoder->last_sink_timestamp); - } else if (base_video_decoder->last_sink_offset_end != -1) { - GstVideoCodecState *state; - -#if 0 - /* FIXME perhaps should use this to determine if the granulepos - * is valid */ - { - guint64 pt; - int dist_h; - int dist_l; - int dist; - int delay; - guint64 dt; - gint64 granulepos = base_video_decoder->last_sink_offset_end; - - pt = ((granulepos >> 22) + - (granulepos & OGG_DIRAC_GRANULE_LOW_MASK)) >> 9; - dist_h = (granulepos >> 22) & 0xff; - dist_l = granulepos & 0xff; - dist = (dist_h << 8) | dist_l; - delay = (granulepos >> 9) & 0x1fff; - dt = pt - delay; - GST_DEBUG ("gp pt %lld dist %d delay %d dt %lld", pt, dist, delay, dt); - } -#endif - state = gst_video_decoder_get_state (base_video_decoder); - base_video_decoder->current_frame->pts = - gst_util_uint64_scale (granulepos_to_frame - (base_video_decoder->last_sink_offset_end), state->fps_d * GST_SECOND, - state->fps_n); - } else { - base_video_decoder->current_frame->pts = -1; - } -#endif - - g_free (data); - } - - if (!schro_decoder->seq_header_buffer_seen) { - gst_adapter_flush (adapter, schro_decoder->next); - return GST_FLOW_OK; - } - - if (SCHRO_PARSE_CODE_IS_PICTURE (schro_decoder->parse_code)) { - guint8 tmp[4]; - - gst_adapter_copy (adapter, tmp, SCHRO_PARSE_HEADER_SIZE, 4); - - /* What is the point of this ? BaseVideoDecoder doesn't - * do anything with presentation_frame_number */ - frame->presentation_frame_number = GST_READ_UINT32_BE (tmp); - - gst_video_decoder_add_to_frame (base_video_decoder, schro_decoder->next); - return gst_video_decoder_have_frame (base_video_decoder); - } else { - gst_video_decoder_add_to_frame (base_video_decoder, schro_decoder->next); - } - - return GST_FLOW_OK; -} - -static void -gst_schrodec_send_tags (GstSchroDec * schro_dec) -{ - GstTagList *list; - - list = gst_tag_list_new_empty (); - gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, - GST_TAG_VIDEO_CODEC, "Dirac", NULL); - - gst_pad_push_event (GST_VIDEO_DECODER_SRC_PAD (schro_dec), - gst_event_new_tag (list)); -} - -static GstFlowReturn -gst_schro_dec_process (GstSchroDec * schro_dec, gboolean eos) -{ - gboolean go; - GstFlowReturn ret; - - ret = GST_FLOW_OK; - go = TRUE; - while (go) { - int it; - - it = schro_decoder_autoparse_wait (schro_dec->decoder); - - switch (it) { - case SCHRO_DECODER_FIRST_ACCESS_UNIT: - break; - case SCHRO_DECODER_NEED_BITS: - GST_DEBUG ("need bits"); - go = 0; - break; - case SCHRO_DECODER_NEED_FRAME: - { - GstBuffer *outbuf; - GstVideoCodecState *state; - SchroFrame *schro_frame; - - GST_DEBUG ("need frame"); - - state = - gst_video_decoder_get_output_state (GST_VIDEO_DECODER (schro_dec)); - outbuf = - gst_video_decoder_allocate_output_buffer (GST_VIDEO_DECODER - (schro_dec)); - schro_frame = gst_schro_buffer_wrap (outbuf, TRUE, &state->info); - schro_decoder_add_output_picture (schro_dec->decoder, schro_frame); - gst_video_codec_state_unref (state); - break; - } - case SCHRO_DECODER_OK: - { - SchroFrame *schro_frame; - SchroTag *tag; - GstVideoCodecFrame *frame; - - GST_DEBUG ("got frame"); - - tag = schro_decoder_get_picture_tag (schro_dec->decoder); - schro_frame = schro_decoder_pull (schro_dec->decoder); - frame = tag->value; - - if (schro_frame) { - if ((frame->output_buffer = gst_schro_frame_get_buffer (schro_frame))) { - GstFlowReturn flow_ret; - - flow_ret = - gst_video_decoder_finish_frame (GST_VIDEO_DECODER - (schro_dec), frame); - if (flow_ret != GST_FLOW_OK) { - GST_DEBUG ("finish frame returned %d", flow_ret); - return flow_ret; - } - } else { - GST_DEBUG ("skipped frame"); - } - - schro_frame_unref (schro_frame); - } - schro_tag_free (tag); - if (!eos) { - go = FALSE; - } - } - - break; - case SCHRO_DECODER_EOS: - GST_DEBUG ("eos"); - go = FALSE; - break; - case SCHRO_DECODER_ERROR: - go = FALSE; - GST_DEBUG ("codec error"); - ret = GST_FLOW_ERROR; - break; - default: - break; - } - } - return ret; -} - -GstFlowReturn -gst_schro_dec_handle_frame (GstVideoDecoder * base_video_decoder, - GstVideoCodecFrame * frame) -{ - GstSchroDec *schro_dec; - SchroBuffer *input_buffer; - - schro_dec = GST_SCHRO_DEC (base_video_decoder); - - GST_DEBUG ("handle frame"); - - input_buffer = gst_schro_wrap_gst_buffer (frame->input_buffer); - frame->input_buffer = NULL; - - input_buffer->tag = schro_tag_new (frame, NULL); - - schro_decoder_autoparse_push (schro_dec->decoder, input_buffer); - - return gst_schro_dec_process (schro_dec, FALSE); -} - -GstFlowReturn -gst_schro_dec_finish (GstVideoDecoder * base_video_decoder) -{ - GstSchroDec *schro_dec; - - schro_dec = GST_SCHRO_DEC (base_video_decoder); - - GST_DEBUG ("finish"); - - schro_decoder_autoparse_push_end_of_sequence (schro_dec->decoder); - - return gst_schro_dec_process (schro_dec, TRUE); -} - -static gboolean -gst_schro_dec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query) -{ - GstBufferPool *pool; - GstStructure *config; - - if (!GST_VIDEO_DECODER_CLASS (parent_class)->decide_allocation (decoder, - query)) - return FALSE; - - gst_query_parse_nth_allocation_pool (query, 0, &pool, NULL, NULL, NULL); - - config = gst_buffer_pool_get_config (pool); - if (gst_query_find_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL)) { - gst_buffer_pool_config_add_option (config, - GST_BUFFER_POOL_OPTION_VIDEO_META); - } - gst_buffer_pool_set_config (pool, config); - gst_object_unref (pool); - - return TRUE; -} diff --git a/ext/schroedinger/gstschroenc.c b/ext/schroedinger/gstschroenc.c deleted file mode 100644 index cf99316d9e..0000000000 --- a/ext/schroedinger/gstschroenc.c +++ /dev/null @@ -1,795 +0,0 @@ -/* Schrodinger - * Copyright (C) 2006 David Schleef - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include "gstschroutils.h" - -GST_DEBUG_CATEGORY_EXTERN (schro_debug); -#define GST_CAT_DEFAULT schro_debug - -#define GST_TYPE_SCHRO_ENC \ - (gst_schro_enc_get_type()) -#define GST_SCHRO_ENC(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SCHRO_ENC,GstSchroEnc)) -#define GST_SCHRO_ENC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SCHRO_ENC,GstSchroEncClass)) -#define GST_IS_SCHRO_ENC(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SCHRO_ENC)) -#define GST_IS_SCHRO_ENC_CLASS(obj) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SCHRO_ENC)) - -typedef struct _GstSchroEnc GstSchroEnc; -typedef struct _GstSchroEncClass GstSchroEncClass; - -struct _GstSchroEnc -{ - GstVideoEncoder base_encoder; - - GstPad *sinkpad; - GstPad *srcpad; - - /* state */ - SchroEncoder *encoder; - SchroVideoFormat *video_format; - - guint64 last_granulepos; - guint64 granule_offset; - - GstVideoCodecState *input_state; -}; - -struct _GstSchroEncClass -{ - GstVideoEncoderClass parent_class; -}; - -GType gst_schro_enc_get_type (void); - - - -enum -{ - LAST_SIGNAL -}; - -enum -{ - ARG_0 -}; - -static void gst_schro_enc_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); -static void gst_schro_enc_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); - -static GstFlowReturn gst_schro_enc_process (GstSchroEnc * schro_enc); - -static gboolean gst_schro_enc_set_format (GstVideoEncoder * - base_video_encoder, GstVideoCodecState * state); -static gboolean gst_schro_enc_start (GstVideoEncoder * base_video_encoder); -static gboolean gst_schro_enc_stop (GstVideoEncoder * base_video_encoder); -static GstFlowReturn gst_schro_enc_finish (GstVideoEncoder * - base_video_encoder); -static GstFlowReturn gst_schro_enc_handle_frame (GstVideoEncoder * - base_video_encoder, GstVideoCodecFrame * frame); -static GstFlowReturn gst_schro_enc_pre_push (GstVideoEncoder * - base_video_encoder, GstVideoCodecFrame * frame); -static void gst_schro_enc_finalize (GObject * object); -static gboolean gst_schro_enc_propose_allocation (GstVideoEncoder * encoder, - GstQuery * query); - -static GstStaticPadTemplate gst_schro_enc_sink_template = -GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (GST_SCHRO_YUV_LIST)) - ); - -static GstStaticPadTemplate gst_schro_enc_src_template = - GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-dirac;video/x-qt-part;video/x-mp4-part") - ); - -#define parent_class gst_schro_enc_parent_class -G_DEFINE_TYPE (GstSchroEnc, gst_schro_enc, GST_TYPE_VIDEO_ENCODER); - -static GType -register_enum_list (const SchroEncoderSetting * setting) -{ - GType type; - static GEnumValue *enumtypes; - int n; - char *typename; - int i; - - n = setting->max + 1; - - enumtypes = g_malloc0 ((n + 1) * sizeof (GEnumValue)); - for (i = 0; i < n; i++) { - gchar *nick; - - enumtypes[i].value = i; - nick = g_strdelimit (g_strdup (setting->enum_list[i]), "_", '-'); - enumtypes[i].value_name = g_intern_static_string (nick); - enumtypes[i].value_nick = enumtypes[i].value_name; - } - - typename = g_strdup_printf ("SchroEncoderSettingEnum_%s", setting->name); - type = g_enum_register_static (typename, enumtypes); - g_free (typename); - - return type; -} - -static void -gst_schro_enc_class_init (GstSchroEncClass * klass) -{ - GObjectClass *gobject_class; - GstElementClass *element_class; - GstVideoEncoderClass *basevideocoder_class; - int i; - - gobject_class = G_OBJECT_CLASS (klass); - element_class = GST_ELEMENT_CLASS (klass); - basevideocoder_class = GST_VIDEO_ENCODER_CLASS (klass); - - gobject_class->set_property = gst_schro_enc_set_property; - gobject_class->get_property = gst_schro_enc_get_property; - gobject_class->finalize = gst_schro_enc_finalize; - - for (i = 0; i < schro_encoder_get_n_settings (); i++) { - const SchroEncoderSetting *setting; - - setting = schro_encoder_get_setting_info (i); - - /* we do this by checking downstream caps, and the profile/level selected - * should be read from the output caps and not from properties */ - if (strcmp (setting->name, "force_profile") == 0 - || strcmp (setting->name, "profile") == 0 - || strcmp (setting->name, "level") == 0) - continue; - - /* we configure this based on the input caps */ - if (strcmp (setting->name, "interlaced_coding") == 0) - continue; - - switch (setting->type) { - case SCHRO_ENCODER_SETTING_TYPE_BOOLEAN: - g_object_class_install_property (gobject_class, i + 1, - g_param_spec_boolean (setting->name, setting->name, setting->name, - setting->default_value, G_PARAM_READWRITE)); - break; - case SCHRO_ENCODER_SETTING_TYPE_INT: - g_object_class_install_property (gobject_class, i + 1, - g_param_spec_int (setting->name, setting->name, setting->name, - setting->min, setting->max, setting->default_value, - G_PARAM_READWRITE)); - break; - case SCHRO_ENCODER_SETTING_TYPE_ENUM: - g_object_class_install_property (gobject_class, i + 1, - g_param_spec_enum (setting->name, setting->name, setting->name, - register_enum_list (setting), setting->default_value, - G_PARAM_READWRITE)); - break; - case SCHRO_ENCODER_SETTING_TYPE_DOUBLE: - g_object_class_install_property (gobject_class, i + 1, - g_param_spec_double (setting->name, setting->name, setting->name, - setting->min, setting->max, setting->default_value, - G_PARAM_READWRITE)); - break; - default: - break; - } - } - - gst_element_class_add_static_pad_template (element_class, - &gst_schro_enc_src_template); - gst_element_class_add_static_pad_template (element_class, - &gst_schro_enc_sink_template); - - gst_element_class_set_static_metadata (element_class, "Dirac Encoder", - "Codec/Encoder/Video", - "Encode raw video into Dirac stream", "David Schleef "); - - basevideocoder_class->set_format = - GST_DEBUG_FUNCPTR (gst_schro_enc_set_format); - basevideocoder_class->start = GST_DEBUG_FUNCPTR (gst_schro_enc_start); - basevideocoder_class->stop = GST_DEBUG_FUNCPTR (gst_schro_enc_stop); - basevideocoder_class->finish = GST_DEBUG_FUNCPTR (gst_schro_enc_finish); - basevideocoder_class->handle_frame = - GST_DEBUG_FUNCPTR (gst_schro_enc_handle_frame); - basevideocoder_class->pre_push = GST_DEBUG_FUNCPTR (gst_schro_enc_pre_push); - basevideocoder_class->propose_allocation = - GST_DEBUG_FUNCPTR (gst_schro_enc_propose_allocation); -} - -static void -gst_schro_enc_init (GstSchroEnc * schro_enc) -{ - GST_DEBUG ("gst_schro_enc_init"); - - GST_PAD_SET_ACCEPT_TEMPLATE (GST_VIDEO_ENCODER_SINK_PAD (schro_enc)); - - /* Normally, we'd create the encoder in ->start(), but we use the - * encoder to store object properties. So it needs to be created - * here. */ - schro_enc->encoder = schro_encoder_new (); - schro_encoder_set_packet_assembly (schro_enc->encoder, TRUE); - schro_enc->video_format = schro_encoder_get_video_format (schro_enc->encoder); -} - -static void -gst_schro_enc_finalize (GObject * object) -{ - GstSchroEnc *schro_enc = GST_SCHRO_ENC (object); - - if (schro_enc->encoder) { - schro_encoder_free (schro_enc->encoder); - schro_enc->encoder = NULL; - } - if (schro_enc->video_format) { - g_free (schro_enc->video_format); - schro_enc->video_format = NULL; - } - if (schro_enc->input_state) - gst_video_codec_state_unref (schro_enc->input_state); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -static const gchar * -get_profile_name (int profile) -{ - switch (profile) { - case 0: - return "vc2-low-delay"; - case 1: - return "vc2-simple"; - case 2: - return "vc2-main"; - case 8: - return "main"; - default: - break; - } - return "unknown"; -} - -static const gchar * -get_level_name (int level) -{ - switch (level) { - case 0: - return "0"; - case 1: - return "1"; - case 128: - return "128"; - default: - break; - } - /* need to add it to template caps, so return 0 for now */ - GST_WARNING ("unhandled dirac level %u", level); - return "0"; -} - -static void -gst_schro_enc_negotiate_profile (GstSchroEnc * enc) -{ - GstStructure *s; - const gchar *profile; - const gchar *level; - GstCaps *allowed_caps; - - allowed_caps = gst_pad_get_allowed_caps (GST_VIDEO_ENCODER_SRC_PAD (enc)); - - GST_DEBUG_OBJECT (enc, "allowed caps: %" GST_PTR_FORMAT, allowed_caps); - - if (allowed_caps == NULL) - return; - - if (gst_caps_is_empty (allowed_caps) || gst_caps_is_any (allowed_caps)) - goto out; - - allowed_caps = gst_caps_make_writable (allowed_caps); - allowed_caps = gst_caps_fixate (allowed_caps); - s = gst_caps_get_structure (allowed_caps, 0); - - profile = gst_structure_get_string (s, "profile"); - if (profile) { - if (!strcmp (profile, "vc2-low-delay")) { - schro_encoder_setting_set_double (enc->encoder, "force_profile", 1); - } else if (!strcmp (profile, "vc2-simple")) { - schro_encoder_setting_set_double (enc->encoder, "force_profile", 2); - } else if (!strcmp (profile, "vc2-main")) { - schro_encoder_setting_set_double (enc->encoder, "force_profile", 3); - } else if (!strcmp (profile, "main")) { - schro_encoder_setting_set_double (enc->encoder, "force_profile", 4); - } else { - GST_WARNING_OBJECT (enc, "ignoring unknown profile '%s'", profile); - } - } - - level = gst_structure_get_string (s, "level"); - if (level != NULL && strcmp (level, "0") != 0) { - GST_FIXME_OBJECT (enc, "level setting not implemented"); - } - -out: - - gst_caps_unref (allowed_caps); -} - -static gboolean -gst_schro_enc_set_format (GstVideoEncoder * base_video_encoder, - GstVideoCodecState * state) -{ - GstSchroEnc *schro_enc = GST_SCHRO_ENC (base_video_encoder); - GstBuffer *seq_header_buffer; - GstVideoInfo *info = &state->info; - GstVideoCodecState *output_state; - GstClockTime latency; - GstCaps *out_caps; - int level, profile; - - GST_DEBUG ("set_output_caps"); - - schro_video_format_set_std_video_format (schro_enc->video_format, - SCHRO_VIDEO_FORMAT_CUSTOM); - - switch (GST_VIDEO_INFO_FORMAT (info)) { - case GST_VIDEO_FORMAT_I420: - case GST_VIDEO_FORMAT_YV12: -#if SCHRO_CHECK_VERSION(1,0,11) - case GST_VIDEO_FORMAT_Y42B: -#endif - schro_enc->video_format->chroma_format = SCHRO_CHROMA_420; - break; - case GST_VIDEO_FORMAT_YUY2: - case GST_VIDEO_FORMAT_UYVY: -#if SCHRO_CHECK_VERSION(1,0,11) - case GST_VIDEO_FORMAT_v216: - case GST_VIDEO_FORMAT_v210: -#endif - schro_enc->video_format->chroma_format = SCHRO_CHROMA_422; - break; - case GST_VIDEO_FORMAT_AYUV: -#if SCHRO_CHECK_VERSION(1,0,12) - case GST_VIDEO_FORMAT_ARGB: -#endif -#if SCHRO_CHECK_VERSION(1,0,11) - case GST_VIDEO_FORMAT_Y444: - case GST_VIDEO_FORMAT_AYUV64: -#endif - schro_enc->video_format->chroma_format = SCHRO_CHROMA_444; - break; - default: - g_assert_not_reached (); - } - - schro_enc->video_format->frame_rate_numerator = GST_VIDEO_INFO_FPS_N (info); - schro_enc->video_format->frame_rate_denominator = GST_VIDEO_INFO_FPS_D (info); - - /* Seems that schroenc doesn't like unknown framerates, so let's pick - * the random value 30 FPS if the framerate is unknown. - */ - if (schro_enc->video_format->frame_rate_denominator == 0 || - schro_enc->video_format->frame_rate_numerator == 0) { - schro_enc->video_format->frame_rate_numerator = 30; - schro_enc->video_format->frame_rate_denominator = 1; - } - - schro_enc->video_format->width = GST_VIDEO_INFO_WIDTH (info); - schro_enc->video_format->height = GST_VIDEO_INFO_HEIGHT (info); - schro_enc->video_format->clean_width = GST_VIDEO_INFO_WIDTH (info); - schro_enc->video_format->clean_height = GST_VIDEO_INFO_HEIGHT (info); - schro_enc->video_format->left_offset = 0; - schro_enc->video_format->top_offset = 0; - - schro_enc->video_format->aspect_ratio_numerator = GST_VIDEO_INFO_PAR_N (info); - schro_enc->video_format->aspect_ratio_denominator = - GST_VIDEO_INFO_PAR_D (info); - - switch (GST_VIDEO_INFO_FORMAT (&state->info)) { - default: - schro_video_format_set_std_signal_range (schro_enc->video_format, - SCHRO_SIGNAL_RANGE_8BIT_VIDEO); - break; -#if SCHRO_CHECK_VERSION(1,0,11) - case GST_VIDEO_FORMAT_v210: - schro_video_format_set_std_signal_range (schro_enc->video_format, - SCHRO_SIGNAL_RANGE_10BIT_VIDEO); - break; - case GST_VIDEO_FORMAT_v216: - case GST_VIDEO_FORMAT_AYUV64: - schro_enc->video_format->luma_offset = 64 << 8; - schro_enc->video_format->luma_excursion = 219 << 8; - schro_enc->video_format->chroma_offset = 128 << 8; - schro_enc->video_format->chroma_excursion = 224 << 8; - break; -#endif -#if SCHRO_CHECK_VERSION(1,0,12) - case GST_VIDEO_FORMAT_ARGB: - schro_enc->video_format->luma_offset = 256; - schro_enc->video_format->luma_excursion = 511; - schro_enc->video_format->chroma_offset = 256; - schro_enc->video_format->chroma_excursion = 511; - break; -#endif - } - - if (GST_VIDEO_INFO_IS_INTERLACED (&state->info)) { - schro_enc->video_format->interlaced_coding = 1; - } - - /* See if downstream caps specify profile/level */ - gst_schro_enc_negotiate_profile (schro_enc); - - /* Finally set latency */ - latency = gst_util_uint64_scale (GST_SECOND, - schro_enc->video_format->frame_rate_denominator * - (int) schro_encoder_setting_get_double (schro_enc->encoder, - "queue_depth"), schro_enc->video_format->frame_rate_numerator); - gst_video_encoder_set_latency (base_video_encoder, latency, latency); - - schro_video_format_set_std_colour_spec (schro_enc->video_format, - SCHRO_COLOUR_SPEC_HDTV); - - schro_encoder_set_video_format (schro_enc->encoder, schro_enc->video_format); - schro_encoder_start (schro_enc->encoder); - - seq_header_buffer = - gst_schro_wrap_schro_buffer (schro_encoder_encode_sequence_header - (schro_enc->encoder)); - - schro_enc->granule_offset = ~0; - - profile = schro_encoder_setting_get_double (schro_enc->encoder, "profile"); - level = schro_encoder_setting_get_double (schro_enc->encoder, "level"); - - out_caps = gst_caps_new_simple ("video/x-dirac", - "profile", G_TYPE_STRING, get_profile_name (profile), - "level", G_TYPE_STRING, get_level_name (level), NULL); - - output_state = - gst_video_encoder_set_output_state (base_video_encoder, out_caps, state); - - GST_BUFFER_FLAG_SET (seq_header_buffer, GST_BUFFER_FLAG_HEADER); - { - GValue array = { 0 }; - GValue value = { 0 }; - guint8 *outdata; - GstBuffer *buf; - GstMemory *seq_header_memory, *extra_header; - gsize size; - - g_value_init (&array, GST_TYPE_ARRAY); - g_value_init (&value, GST_TYPE_BUFFER); - - buf = gst_buffer_new (); - /* Add the sequence header */ - seq_header_memory = gst_buffer_get_memory (seq_header_buffer, 0); - gst_buffer_append_memory (buf, seq_header_memory); - - size = gst_buffer_get_size (buf) + SCHRO_PARSE_HEADER_SIZE; - outdata = g_malloc0 (SCHRO_PARSE_HEADER_SIZE); - - GST_WRITE_UINT32_BE (outdata, 0x42424344); - GST_WRITE_UINT8 (outdata + 4, SCHRO_PARSE_CODE_END_OF_SEQUENCE); - GST_WRITE_UINT32_BE (outdata + 5, 0); - GST_WRITE_UINT32_BE (outdata + 9, size); - - extra_header = gst_memory_new_wrapped (0, outdata, SCHRO_PARSE_HEADER_SIZE, - 0, SCHRO_PARSE_HEADER_SIZE, outdata, g_free); - gst_buffer_append_memory (buf, extra_header); - - /* ogg(mux) expects the header buffers to have 0 timestamps - - set OFFSET and OFFSET_END accordingly */ - GST_BUFFER_OFFSET (buf) = 0; - GST_BUFFER_OFFSET_END (buf) = 0; - GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_HEADER); - - gst_value_set_buffer (&value, buf); - gst_buffer_unref (buf); - gst_value_array_append_value (&array, &value); - gst_structure_set_value (gst_caps_get_structure (output_state->caps, 0), - "streamheader", &array); - g_value_unset (&value); - g_value_unset (&array); - } - gst_buffer_unref (seq_header_buffer); - - gst_video_codec_state_unref (output_state); - - /* And save the input state for later use */ - if (schro_enc->input_state) - gst_video_codec_state_unref (schro_enc->input_state); - schro_enc->input_state = gst_video_codec_state_ref (state); - - return TRUE; -} - -static void -gst_schro_enc_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec) -{ - GstSchroEnc *src; - - src = GST_SCHRO_ENC (object); - - GST_DEBUG ("%s", pspec->name); - - if (prop_id >= 1) { - const SchroEncoderSetting *setting; - setting = schro_encoder_get_setting_info (prop_id - 1); - switch (G_VALUE_TYPE (value)) { - case G_TYPE_DOUBLE: - schro_encoder_setting_set_double (src->encoder, setting->name, - g_value_get_double (value)); - break; - case G_TYPE_INT: - schro_encoder_setting_set_double (src->encoder, setting->name, - g_value_get_int (value)); - break; - case G_TYPE_BOOLEAN: - schro_encoder_setting_set_double (src->encoder, setting->name, - g_value_get_boolean (value)); - break; - default: - schro_encoder_setting_set_double (src->encoder, setting->name, - g_value_get_enum (value)); - break; - } - } -} - -static void -gst_schro_enc_get_property (GObject * object, guint prop_id, GValue * value, - GParamSpec * pspec) -{ - GstSchroEnc *src; - - src = GST_SCHRO_ENC (object); - - if (prop_id >= 1) { - const SchroEncoderSetting *setting; - setting = schro_encoder_get_setting_info (prop_id - 1); - switch (G_VALUE_TYPE (value)) { - case G_TYPE_DOUBLE: - g_value_set_double (value, - schro_encoder_setting_get_double (src->encoder, setting->name)); - break; - case G_TYPE_INT: - g_value_set_int (value, - schro_encoder_setting_get_double (src->encoder, setting->name)); - break; - case G_TYPE_BOOLEAN: - g_value_set_boolean (value, - schro_encoder_setting_get_double (src->encoder, setting->name)); - break; - default: - /* it's an enum */ - g_value_set_enum (value, - schro_encoder_setting_get_double (src->encoder, setting->name)); - break; - } - } -} - -static gboolean -gst_schro_enc_start (GstVideoEncoder * base_video_encoder) -{ - return TRUE; -} - -static gboolean -gst_schro_enc_stop (GstVideoEncoder * base_video_encoder) -{ - return TRUE; -} - -static GstFlowReturn -gst_schro_enc_finish (GstVideoEncoder * base_video_encoder) -{ - GstSchroEnc *schro_enc = GST_SCHRO_ENC (base_video_encoder); - - GST_DEBUG ("finish"); - - schro_encoder_end_of_stream (schro_enc->encoder); - gst_schro_enc_process (schro_enc); - - return GST_FLOW_OK; -} - -static GstFlowReturn -gst_schro_enc_handle_frame (GstVideoEncoder * base_video_encoder, - GstVideoCodecFrame * frame) -{ - GstSchroEnc *schro_enc = GST_SCHRO_ENC (base_video_encoder); - SchroFrame *schro_frame; - GstFlowReturn ret; - GstVideoInfo *info = &schro_enc->input_state->info; - - if (schro_enc->granule_offset == ~0LL) { - schro_enc->granule_offset = - gst_util_uint64_scale (frame->pts, 2 * GST_VIDEO_INFO_FPS_N (info), - GST_SECOND * GST_VIDEO_INFO_FPS_D (info)); - GST_DEBUG ("granule offset %" G_GINT64_FORMAT, schro_enc->granule_offset); - } - - schro_frame = gst_schro_buffer_wrap (frame->input_buffer, FALSE, info); - - GST_DEBUG ("pushing frame %p", frame); - schro_encoder_push_frame_full (schro_enc->encoder, schro_frame, frame); - - ret = gst_schro_enc_process (schro_enc); - - return ret; -} - -static GstFlowReturn -gst_schro_enc_pre_push (GstVideoEncoder * base_video_encoder, - GstVideoCodecFrame * frame) -{ - GstSchroEnc *schro_enc; - int delay; - int dist; - int pt; - int dt; - guint64 granulepos_hi; - guint64 granulepos_low; - GstBuffer *buf = frame->output_buffer; - - schro_enc = GST_SCHRO_ENC (base_video_encoder); - - pt = frame->presentation_frame_number * 2 + schro_enc->granule_offset; - dt = frame->decode_frame_number * 2 + schro_enc->granule_offset; - delay = pt - dt; - dist = frame->distance_from_sync; - - GST_DEBUG ("sys %d dpn %d pt %d dt %d delay %d dist %d", - (int) frame->system_frame_number, - (int) frame->decode_frame_number, pt, dt, delay, dist); - - granulepos_hi = (((guint64) pt - delay) << 9) | ((dist >> 8)); - granulepos_low = (delay << 9) | (dist & 0xff); - GST_DEBUG ("granulepos %" G_GINT64_FORMAT ":%" G_GINT64_FORMAT, granulepos_hi, - granulepos_low); - -#if 0 - if (frame->is_eos) { - GST_BUFFER_OFFSET_END (buf) = schro_enc->last_granulepos; - } else { -#endif - schro_enc->last_granulepos = (granulepos_hi << 22) | (granulepos_low); - GST_BUFFER_OFFSET_END (buf) = schro_enc->last_granulepos; -#if 0 - } -#endif - - GST_BUFFER_OFFSET (buf) = gst_util_uint64_scale (schro_enc->last_granulepos, - GST_SECOND * schro_enc->video_format->frame_rate_denominator, - schro_enc->video_format->frame_rate_numerator); - - return GST_FLOW_OK; -} - -static gboolean -gst_schro_enc_propose_allocation (GstVideoEncoder * encoder, GstQuery * query) -{ - gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL); - - return GST_VIDEO_ENCODER_CLASS (parent_class)->propose_allocation (encoder, - query); -} - - -static GstFlowReturn -gst_schro_enc_process (GstSchroEnc * schro_enc) -{ - SchroBuffer *encoded_buffer; - GstVideoCodecFrame *frame; - GstFlowReturn ret; - int presentation_frame; - void *voidptr; - GstVideoEncoder *base_video_encoder = GST_VIDEO_ENCODER (schro_enc); - - GST_DEBUG ("process"); - - while (1) { - switch (schro_encoder_wait (schro_enc->encoder)) { - case SCHRO_STATE_NEED_FRAME: - return GST_FLOW_OK; - case SCHRO_STATE_END_OF_STREAM: - GST_DEBUG ("EOS"); - return GST_FLOW_OK; - case SCHRO_STATE_HAVE_BUFFER: - voidptr = NULL; - encoded_buffer = schro_encoder_pull_full (schro_enc->encoder, - &presentation_frame, &voidptr); - frame = voidptr; - if (encoded_buffer == NULL) { - GST_DEBUG ("encoder_pull returned NULL"); - /* FIXME This shouldn't happen */ - return GST_FLOW_ERROR; - } -#if SCHRO_CHECK_VERSION (1, 0, 9) - { - GstMessage *message; - GstStructure *structure; - GstBuffer *buf; - gpointer data; - - data = g_malloc (sizeof (double) * 21); - schro_encoder_get_frame_stats (schro_enc->encoder, - (double *) data, 21); - buf = gst_buffer_new_wrapped (data, sizeof (double) * 21); - structure = gst_structure_new ("GstSchroEnc", - "frame-stats", GST_TYPE_BUFFER, buf, NULL); - gst_buffer_unref (buf); - message = gst_message_new_element (GST_OBJECT (schro_enc), structure); - gst_element_post_message (GST_ELEMENT (schro_enc), message); - } -#endif - - if (voidptr == NULL) { - GST_DEBUG ("got eos"); - //frame = schro_enc->eos_frame; - frame = NULL; - schro_buffer_unref (encoded_buffer); - } - - /* FIXME: Get the frame from somewhere somehow... */ - if (frame) { - if (SCHRO_PARSE_CODE_IS_SEQ_HEADER (encoded_buffer->data[4])) { - GST_VIDEO_CODEC_FRAME_SET_SYNC_POINT (frame); - } - - frame->output_buffer = gst_schro_wrap_schro_buffer (encoded_buffer); - - ret = gst_video_encoder_finish_frame (base_video_encoder, frame); - - if (ret != GST_FLOW_OK) { - GST_DEBUG ("pad_push returned %d", ret); - return ret; - } - } - break; - case SCHRO_STATE_AGAIN: - break; - } - } - return GST_FLOW_OK; -} diff --git a/ext/schroedinger/gstschroutils.c b/ext/schroedinger/gstschroutils.c deleted file mode 100644 index 87555f088c..0000000000 --- a/ext/schroedinger/gstschroutils.c +++ /dev/null @@ -1,224 +0,0 @@ -/* Schrodinger - * Copyright (C) 2008 David Schleef - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include "gstschroutils.h" - -//#define SCHRO_ENABLE_UNSTABLE_API - -#include -#include -#include -#include -#include -#include - -GST_DEBUG_CATEGORY_EXTERN (schro_debug); -#define GST_CAT_DEFAULT schro_debug - -typedef struct -{ - GstVideoFrame frame; -} FrameData; - - -static void -gst_schro_frame_free (SchroFrame * frame, void *priv) -{ - FrameData *data = priv; - - gst_video_frame_unmap (&data->frame); - - g_slice_free (FrameData, data); -} - -GstBuffer * -gst_schro_frame_get_buffer (SchroFrame * frame) -{ - if (frame->priv) - return gst_buffer_ref (((FrameData *) frame->priv)->frame.buffer); - - return NULL; -} - -SchroFrame * -gst_schro_buffer_wrap (GstBuffer * buf, gboolean write, GstVideoInfo * vinfo) -{ - SchroFrame *frame; - GstVideoFrame vframe; - FrameData *data; - gint i; - - if (!gst_video_frame_map (&vframe, vinfo, buf, - (write ? GST_MAP_READWRITE : GST_MAP_READ))) - return NULL; - - frame = schro_frame_new (); - - frame->width = GST_VIDEO_FRAME_WIDTH (&vframe); - frame->height = GST_VIDEO_FRAME_HEIGHT (&vframe); - - switch (GST_VIDEO_FRAME_FORMAT (&vframe)) { - case GST_VIDEO_FORMAT_I420: - case GST_VIDEO_FORMAT_YV12: - frame->format = SCHRO_FRAME_FORMAT_U8_420; - break; - case GST_VIDEO_FORMAT_YUY2: - frame->format = SCHRO_FRAME_FORMAT_YUYV; - break; - case GST_VIDEO_FORMAT_UYVY: - frame->format = SCHRO_FRAME_FORMAT_UYVY; - break; - case GST_VIDEO_FORMAT_AYUV: - frame->format = SCHRO_FRAME_FORMAT_AYUV; - break; -#if SCHRO_CHECK_VERSION(1,0,12) - case GST_VIDEO_FORMAT_ARGB: - frame->format = SCHRO_FRAME_FORMAT_ARGB; - break; -#endif -#if SCHRO_CHECK_VERSION(1,0,11) - case GST_VIDEO_FORMAT_Y42B: - frame->format = SCHRO_FRAME_FORMAT_U8_422; - break; - case GST_VIDEO_FORMAT_Y444: - frame->format = SCHRO_FRAME_FORMAT_U8_444; - break; - case GST_VIDEO_FORMAT_v210: - frame->format = SCHRO_FRAME_FORMAT_v210; - break; - case GST_VIDEO_FORMAT_v216: - frame->format = SCHRO_FRAME_FORMAT_v216; - break; - case GST_VIDEO_FORMAT_AYUV64: - frame->format = SCHRO_FRAME_FORMAT_AY64; - break; -#endif - default: - g_assert_not_reached (); - return NULL; - } - - if (SCHRO_FRAME_IS_PACKED (frame->format)) { - frame->components[0].format = frame->format; - frame->components[0].width = frame->width; - frame->components[0].height = frame->height; - frame->components[0].stride = GST_VIDEO_FRAME_COMP_STRIDE (&vframe, 0); - frame->components[0].length = frame->components[0].stride * frame->height; - frame->components[0].data = vframe.data[0]; - frame->components[0].v_shift = 0; - frame->components[0].h_shift = 0; - } else { - for (i = 0; i < GST_VIDEO_FRAME_N_COMPONENTS (&vframe); i++) { - frame->components[i].format = frame->format; - frame->components[i].width = GST_VIDEO_FRAME_COMP_WIDTH (&vframe, i); - frame->components[i].height = GST_VIDEO_FRAME_COMP_HEIGHT (&vframe, i); - frame->components[i].stride = GST_VIDEO_FRAME_COMP_STRIDE (&vframe, i); - frame->components[i].length = - frame->components[i].stride * frame->components[i].height; - frame->components[i].data = GST_VIDEO_FRAME_COMP_DATA (&vframe, i); - if (i == 0) { - frame->components[i].v_shift = 0; - frame->components[i].h_shift = 0; - } else { - frame->components[i].v_shift = - SCHRO_FRAME_FORMAT_H_SHIFT (frame->format); - frame->components[i].h_shift = - SCHRO_FRAME_FORMAT_H_SHIFT (frame->format); - } - } - } - - data = g_slice_new0 (FrameData); - data->frame = vframe; - schro_frame_set_free_callback (frame, gst_schro_frame_free, data); - - return frame; -} - -static void -schro_buf_free_func (gpointer priv) -{ - SchroBuffer *buffer = (SchroBuffer *) priv; - - schro_buffer_unref (buffer); -} - -/* takes the reference */ -GstBuffer * -gst_schro_wrap_schro_buffer (SchroBuffer * buffer) -{ - GstMemory *mem; - GstBuffer *buf; - - mem = - gst_memory_new_wrapped (0, buffer->data, buffer->length, 0, - buffer->length, buffer, schro_buf_free_func); - buf = gst_buffer_new (); - gst_buffer_append_memory (buf, mem); - - return buf; -} - -typedef struct -{ - GstMemory *mem; - GstMapInfo info; -} BufferData; - -static void -gst_schro_buffer_free (SchroBuffer * buffer, void *priv) -{ - BufferData *data = priv; - - gst_memory_unmap (data->mem, &data->info); - gst_memory_unref (data->mem); - g_slice_free (BufferData, priv); -} - -SchroBuffer * -gst_schro_wrap_gst_buffer (GstBuffer * buffer) -{ - SchroBuffer *schrobuf; - GstMemory *mem; - GstMapInfo info; - BufferData *data; - - mem = gst_buffer_get_all_memory (buffer); - if (!gst_memory_map (mem, &info, GST_MAP_READ)) { - GST_ERROR ("Couldn't get readable memory from gstbuffer"); - return NULL; - } - - /* FIXME : We can't control if data won't be read/write outside - * of schro ... */ - data = g_slice_new0 (BufferData); - data->info = info; - data->mem = mem; - - schrobuf = schro_buffer_new_with_data (info.data, info.size); - schrobuf->free = gst_schro_buffer_free; - schrobuf->priv = data; - - return schrobuf; -} diff --git a/ext/schroedinger/gstschroutils.h b/ext/schroedinger/gstschroutils.h deleted file mode 100644 index 98f472c483..0000000000 --- a/ext/schroedinger/gstschroutils.h +++ /dev/null @@ -1,45 +0,0 @@ -/* Schrodinger - * Copyright (C) 2008 David Schleef - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef _GST_SCHRO_UTILS_H_ -#define _GST_SCHRO_UTILS_H_ - -#include -#include -#include - -#if SCHRO_CHECK_VERSION(1,0,12) -#define GST_SCHRO_YUV_LIST "{ I420, YV12, YUY2, UYVY, AYUV, Y42B, Y444, v216, v210, AY64, ARGB }" -#else -#if SCHRO_CHECK_VERSION(1,0,11) -#define GST_SCHRO_YUV_LIST "{ I420, YV12, YUY2, UYVY, AYUV, Y42B, Y444, v216, v210, AY64 }" -#else -#define GST_SCHRO_YUV_LIST "{ I420, YV12, YUY2, UYVY, AYUV }" -#endif -#endif - -SchroFrame * -gst_schro_buffer_wrap (GstBuffer *buf, gboolean write, GstVideoInfo * vinfo); -GstBuffer * gst_schro_frame_get_buffer (SchroFrame * frame); - -GstBuffer * gst_schro_wrap_schro_buffer (SchroBuffer *buffer); -SchroBuffer * gst_schro_wrap_gst_buffer (GstBuffer *buffer); - -#endif - diff --git a/ext/schroedinger/meson.build b/ext/schroedinger/meson.build deleted file mode 100644 index d37b70fd5d..0000000000 --- a/ext/schroedinger/meson.build +++ /dev/null @@ -1,20 +0,0 @@ -schro_sources = [ - 'gstschro.c', - 'gstschrodec.c', - 'gstschroenc.c', - 'gstschroutils.c', -] - -schro_dep = dependency('schroedinger-1.0', version : '>= 1.0.10', required : false) - -if schro_dep.found() - gstschro = library('gstschro', - schro_sources, - c_args : gst_plugins_bad_args, - link_args : noseh_link_args, - include_directories : [configinc], - dependencies : [gstvideo_dep, schro_dep], - install : true, - install_dir : plugins_install_dir, - ) -endif diff --git a/meson.build b/meson.build index b6c00442f5..7a92ef4cbc 100644 --- a/meson.build +++ b/meson.build @@ -213,7 +213,6 @@ check_functions = [ # check token HAVE_RSVG_2_36_2 # check token HAVE_RTMP # check token HAVE_SBC -# check token HAVE_SCHRO # check token HAVE_SDL # check token HAVE_SHM # check token HAVE_SMOOTHSTREAMING diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am index 5a7c497b28..dc2cac995d 100644 --- a/tests/check/Makefile.am +++ b/tests/check/Makefile.am @@ -108,12 +108,6 @@ else check_ofa = endif -if USE_SCHRO -check_schro=elements/schroenc -else -check_schro= -endif - if USE_X265 check_x265enc=elements/x265enc else @@ -285,7 +279,6 @@ check_PROGRAMS = \ libs/vp8parser \ $(check_uvch264) \ libs/vc1parser \ - $(check_schro) \ $(check_x265enc) \ elements/viewfinderbin \ $(check_zbar) \ diff --git a/tests/check/elements/.gitignore b/tests/check/elements/.gitignore index d264dae579..5265a88f5d 100644 --- a/tests/check/elements/.gitignore +++ b/tests/check/elements/.gitignore @@ -52,7 +52,6 @@ rglimiter rgvolume rtponvifparse rtponviftimestamp -schroenc shm spectrum srtp diff --git a/tests/check/elements/schroenc.c b/tests/check/elements/schroenc.c deleted file mode 100644 index c38ca98e2f..0000000000 --- a/tests/check/elements/schroenc.c +++ /dev/null @@ -1,177 +0,0 @@ -/* GStreamer - * - * Copyright (c) 2010 Sebastian Dröge - * Copyright (c) 2010 David Schleef - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include - -static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-dirac, " - "width = (int) [1, MAX], " - "height = (int) [1, MAX], " "framerate = (fraction) [0, MAX]")); - -static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-raw, " - "format = (string) I420, " - "width = (int) [1, MAX], " - "height = (int) [1, MAX], " "framerate = (fraction) [0, MAX]")); - -static GstPad *sinkpad, *srcpad; - -static GstElement * -setup_schroenc (const gchar * src_caps_str) -{ - GstElement *schroenc; - GstCaps *srccaps = NULL; - GstBus *bus; - - if (src_caps_str) { - srccaps = gst_caps_from_string (src_caps_str); - fail_unless (srccaps != NULL); - } - - schroenc = gst_check_setup_element ("schroenc"); - fail_unless (schroenc != NULL); - srcpad = gst_check_setup_src_pad (schroenc, &srctemplate); - sinkpad = gst_check_setup_sink_pad (schroenc, &sinktemplate); - gst_pad_set_active (srcpad, TRUE); - gst_pad_set_active (sinkpad, TRUE); - - gst_check_setup_events (srcpad, schroenc, srccaps, GST_FORMAT_TIME); - - bus = gst_bus_new (); - gst_element_set_bus (schroenc, bus); - - fail_unless (gst_element_set_state (schroenc, - GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE, - "could not set to playing"); - - if (srccaps) - gst_caps_unref (srccaps); - - buffers = NULL; - return schroenc; -} - -static void -cleanup_schroenc (GstElement * schroenc) -{ - GstBus *bus; - - /* Free parsed buffers */ - gst_check_drop_buffers (); - - bus = GST_ELEMENT_BUS (schroenc); - gst_bus_set_flushing (bus, TRUE); - gst_object_unref (bus); - - gst_pad_set_active (srcpad, FALSE); - gst_pad_set_active (sinkpad, FALSE); - gst_check_teardown_src_pad (schroenc); - gst_check_teardown_sink_pad (schroenc); - gst_check_teardown_element (schroenc); -} - -GST_START_TEST (test_encode_simple) -{ - GstElement *schroenc; - GstBuffer *buffer; - gint i; - GList *l; - GstCaps *outcaps, *sinkcaps; - GstSegment seg; - - schroenc = - setup_schroenc - ("video/x-raw,format=(string)I420,width=(int)320,height=(int)240,framerate=(fraction)25/1"); - - g_object_set (schroenc, "queue-depth", 10, NULL); - - gst_segment_init (&seg, GST_FORMAT_TIME); - seg.stop = gst_util_uint64_scale (20, GST_SECOND, 25); - - fail_unless (gst_pad_push_event (srcpad, gst_event_new_segment (&seg))); - - buffer = gst_buffer_new_allocate (NULL, 320 * 240 + 2 * 160 * 120, NULL); - gst_buffer_memset (buffer, 0, 0, -1); - - for (i = 0; i < 20; i++) { - GST_BUFFER_TIMESTAMP (buffer) = gst_util_uint64_scale (i, GST_SECOND, 25); - GST_BUFFER_DURATION (buffer) = gst_util_uint64_scale (1, GST_SECOND, 25); - fail_unless (gst_pad_push (srcpad, gst_buffer_ref (buffer)) == GST_FLOW_OK); - } - - gst_buffer_unref (buffer); - - /* Only 5 buffers are allowed to be queued now */ - fail_unless (g_list_length (buffers) > 10); - - fail_unless (gst_pad_push_event (srcpad, gst_event_new_eos ())); - - - /* All buffers must be there now */ - fail_unless_equals_int (g_list_length (buffers), 20); - - outcaps = - gst_caps_from_string - ("video/x-dirac,width=(int)320,height=(int)240,framerate=(fraction)25/1"); - - for (l = buffers, i = 0; l; l = l->next, i++) { - buffer = l->data; - - if (i == 0) - fail_if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DELTA_UNIT)); - -#if 0 - fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer), - gst_util_uint64_scale (i, GST_SECOND, 25)); -#endif - fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), - gst_util_uint64_scale (1, GST_SECOND, 25)); - - sinkcaps = gst_pad_get_current_caps (sinkpad); - fail_unless (gst_caps_can_intersect (sinkcaps, outcaps)); - gst_caps_unref (sinkcaps); - } - - gst_caps_unref (outcaps); - - cleanup_schroenc (schroenc); -} - -GST_END_TEST; - -static Suite * -schroenc_suite (void) -{ - Suite *s = suite_create ("schroenc"); - TCase *tc_chain = tcase_create ("general"); - - suite_add_tcase (s, tc_chain); - - tcase_add_test (tc_chain, test_encode_simple); - - return s; -} - -GST_CHECK_MAIN (schroenc); diff --git a/tests/check/meson.build b/tests/check/meson.build index 1cb817164c..5b624c2072 100644 --- a/tests/check/meson.build +++ b/tests/check/meson.build @@ -47,7 +47,6 @@ base_tests = [ [['elements/netsim.c']], [['elements/pcapparse.c'], false, [libparser_dep]], [['elements/pnm.c']], - [['elements/schroenc.c'], not schro_dep.found(), [schro_dep]], [['elements/shm.c'], not shm_enabled, shm_deps], [['elements/rtponvifparse.c']], [['elements/rtponviftimestamp.c']],