2001-12-26 21:51:41 +00:00
|
|
|
/* GStreamer
|
|
|
|
* Copyright (C) <2001> David I. Lehn <dlehn@users.sourceforge.net>
|
|
|
|
*
|
|
|
|
* 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., 59 Temple Place - Suite 330,
|
|
|
|
* Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
|
|
|
2008-05-28 11:43:01 +00:00
|
|
|
/**
|
|
|
|
* SECTION:element-a52dec
|
|
|
|
*
|
|
|
|
* Dolby Digital (AC-3) audio decoder.
|
2008-06-13 06:57:21 +00:00
|
|
|
*
|
2008-05-28 11:43:01 +00:00
|
|
|
* <refsect2>
|
|
|
|
* <title>Example launch line</title>
|
2008-06-13 06:57:21 +00:00
|
|
|
* |[
|
2009-05-18 23:51:49 +00:00
|
|
|
* gst-launch dvdreadsrc title=1 ! mpegpsdemux ! a52dec ! audioresample ! audioconvert ! alsasink
|
2008-06-13 06:57:21 +00:00
|
|
|
* ]| Play audio track from a dvd.
|
|
|
|
* |[
|
2008-05-28 11:43:01 +00:00
|
|
|
* gst-launch filesrc location=abc.ac3 ! a52dec ! audioresample ! audioconvert ! alsasink
|
2008-06-13 06:57:21 +00:00
|
|
|
* ]| Decode a stand alone file and play it.
|
2008-05-28 11:43:01 +00:00
|
|
|
* </refsect2>
|
|
|
|
*/
|
|
|
|
|
2003-01-31 00:18:23 +00:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include "config.h"
|
|
|
|
#endif
|
|
|
|
|
2001-12-26 21:51:41 +00:00
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
2004-02-03 02:40:15 +00:00
|
|
|
#include "_stdint.h"
|
2003-04-04 20:46:06 +00:00
|
|
|
|
2001-12-26 21:51:41 +00:00
|
|
|
#include <gst/gst.h>
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
#include <gst/audio/multichannel.h>
|
|
|
|
|
2001-12-26 21:51:41 +00:00
|
|
|
#include <a52dec/a52.h>
|
|
|
|
#include <a52dec/mm_accel.h>
|
|
|
|
#include "gsta52dec.h"
|
|
|
|
|
2010-06-14 12:34:25 +00:00
|
|
|
#if HAVE_ORC
|
|
|
|
#include <orc/orc.h>
|
|
|
|
#endif
|
2005-10-20 09:51:58 +00:00
|
|
|
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
#ifdef LIBA52_DOUBLE
|
|
|
|
#define SAMPLE_WIDTH 64
|
|
|
|
#else
|
|
|
|
#define SAMPLE_WIDTH 32
|
|
|
|
#endif
|
|
|
|
|
2004-04-01 11:48:27 +00:00
|
|
|
GST_DEBUG_CATEGORY_STATIC (a52dec_debug);
|
|
|
|
#define GST_CAT_DEFAULT (a52dec_debug)
|
2001-12-26 21:51:41 +00:00
|
|
|
|
2005-10-20 09:00:30 +00:00
|
|
|
/* A52Dec args */
|
2001-12-26 21:51:41 +00:00
|
|
|
enum
|
|
|
|
{
|
|
|
|
ARG_0,
|
ext/a52dec/gsta52dec.*: Add two things to a52dec: configure the exact output format for ac3 decoding through properti...
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_mode_get_type),
(gst_a52dec_class_init), (gst_a52dec_init), (gst_a52dec_channels),
(gst_a52dec_handle_frame), (gst_a52dec_change_state),
(gst_a52dec_set_property), (gst_a52dec_get_property):
* ext/a52dec/gsta52dec.h:
Patch from from Michal Benes <michal.benes@itonis.tv>:
Add two things to a52dec: configure the exact output format for ac3
decoding through properties, if desired.
By default, configure an output format preferred by downstream. Now
that audioconvert lists caps by preference, this means that a52dec
can do downmixing (iff required) rather than audioconvert, so it can
use the ac3 downmix levels from the bitstream.
2006-09-01 16:21:43 +00:00
|
|
|
ARG_DRC,
|
|
|
|
ARG_MODE,
|
|
|
|
ARG_LFE,
|
2001-12-26 21:51:41 +00:00
|
|
|
};
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
|
|
|
|
GST_PAD_SINK,
|
|
|
|
GST_PAD_ALWAYS,
|
2005-11-25 14:50:19 +00:00
|
|
|
GST_STATIC_CAPS ("audio/x-ac3; audio/ac3; audio/x-private1-ac3")
|
2004-03-14 22:34:30 +00:00
|
|
|
);
|
|
|
|
|
|
|
|
static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
|
|
|
|
GST_PAD_SRC,
|
|
|
|
GST_PAD_ALWAYS,
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
GST_STATIC_CAPS ("audio/x-raw-float, "
|
2005-10-20 09:00:30 +00:00
|
|
|
"endianness = (int) " G_STRINGIFY (G_BYTE_ORDER) ", "
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
"width = (int) " G_STRINGIFY (SAMPLE_WIDTH) ", "
|
2005-10-20 09:00:30 +00:00
|
|
|
"rate = (int) [ 4000, 96000 ], " "channels = (int) [ 1, 6 ]")
|
2004-03-14 22:34:30 +00:00
|
|
|
);
|
|
|
|
|
2009-05-18 23:51:49 +00:00
|
|
|
GST_BOILERPLATE (GstA52Dec, gst_a52dec, GstElement, GST_TYPE_ELEMENT);
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2005-10-20 09:00:30 +00:00
|
|
|
static GstFlowReturn gst_a52dec_chain (GstPad * pad, GstBuffer * buffer);
|
2005-11-25 14:50:19 +00:00
|
|
|
static GstFlowReturn gst_a52dec_chain_raw (GstPad * pad, GstBuffer * buf);
|
|
|
|
static gboolean gst_a52dec_sink_setcaps (GstPad * pad, GstCaps * caps);
|
2005-10-20 09:00:30 +00:00
|
|
|
static gboolean gst_a52dec_sink_event (GstPad * pad, GstEvent * event);
|
2005-09-02 15:43:54 +00:00
|
|
|
static GstStateChangeReturn gst_a52dec_change_state (GstElement * element,
|
|
|
|
GstStateChange transition);
|
2004-03-14 22:34:30 +00:00
|
|
|
|
|
|
|
static void gst_a52dec_set_property (GObject * object, guint prop_id,
|
|
|
|
const GValue * value, GParamSpec * pspec);
|
|
|
|
static void gst_a52dec_get_property (GObject * object, guint prop_id,
|
|
|
|
GValue * value, GParamSpec * pspec);
|
2001-12-26 21:51:41 +00:00
|
|
|
|
ext/a52dec/gsta52dec.*: Add two things to a52dec: configure the exact output format for ac3 decoding through properti...
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_mode_get_type),
(gst_a52dec_class_init), (gst_a52dec_init), (gst_a52dec_channels),
(gst_a52dec_handle_frame), (gst_a52dec_change_state),
(gst_a52dec_set_property), (gst_a52dec_get_property):
* ext/a52dec/gsta52dec.h:
Patch from from Michal Benes <michal.benes@itonis.tv>:
Add two things to a52dec: configure the exact output format for ac3
decoding through properties, if desired.
By default, configure an output format preferred by downstream. Now
that audioconvert lists caps by preference, this means that a52dec
can do downmixing (iff required) rather than audioconvert, so it can
use the ac3 downmix levels from the bitstream.
2006-09-01 16:21:43 +00:00
|
|
|
#define GST_TYPE_A52DEC_MODE (gst_a52dec_mode_get_type())
|
|
|
|
static GType
|
|
|
|
gst_a52dec_mode_get_type (void)
|
|
|
|
{
|
|
|
|
static GType a52dec_mode_type = 0;
|
|
|
|
static const GEnumValue a52dec_modes[] = {
|
|
|
|
{A52_MONO, "Mono", "mono"},
|
|
|
|
{A52_STEREO, "Stereo", "stereo"},
|
|
|
|
{A52_3F, "3 Front", "3f"},
|
|
|
|
{A52_2F1R, "2 Front, 1 Rear", "2f1r"},
|
|
|
|
{A52_3F1R, "3 Front, 1 Rear", "3f1r"},
|
|
|
|
{A52_2F2R, "2 Front, 2 Rear", "2f2r"},
|
|
|
|
{A52_3F2R, "3 Front, 2 Rear", "3f2r"},
|
|
|
|
{A52_DOLBY, "Dolby", "dolby"},
|
|
|
|
{0, NULL, NULL},
|
|
|
|
};
|
|
|
|
|
|
|
|
if (!a52dec_mode_type) {
|
|
|
|
a52dec_mode_type = g_enum_register_static ("GstA52DecMode", a52dec_modes);
|
|
|
|
}
|
|
|
|
return a52dec_mode_type;
|
|
|
|
}
|
|
|
|
|
2003-11-01 01:32:03 +00:00
|
|
|
static void
|
2009-05-18 23:51:49 +00:00
|
|
|
gst_a52dec_base_init (gpointer g_class)
|
2003-11-01 01:32:03 +00:00
|
|
|
{
|
2009-05-18 23:51:49 +00:00
|
|
|
GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
|
2003-11-01 01:32:03 +00:00
|
|
|
|
|
|
|
gst_element_class_add_pad_template (element_class,
|
2003-12-22 01:47:08 +00:00
|
|
|
gst_static_pad_template_get (&sink_factory));
|
2003-11-01 01:32:03 +00:00
|
|
|
gst_element_class_add_pad_template (element_class,
|
2003-12-22 01:47:08 +00:00
|
|
|
gst_static_pad_template_get (&src_factory));
|
2010-03-18 14:53:14 +00:00
|
|
|
gst_element_class_set_details_simple (element_class,
|
|
|
|
"ATSC A/52 audio decoder", "Codec/Decoder/Audio",
|
|
|
|
"Decodes ATSC A/52 encoded audio streams",
|
|
|
|
"David I. Lehn <dlehn@users.sourceforge.net>");
|
2005-10-20 09:00:30 +00:00
|
|
|
|
|
|
|
GST_DEBUG_CATEGORY_INIT (a52dec_debug, "a52dec", 0,
|
|
|
|
"AC3/A52 software decoder");
|
2003-11-01 01:32:03 +00:00
|
|
|
}
|
|
|
|
|
2001-12-26 21:51:41 +00:00
|
|
|
static void
|
|
|
|
gst_a52dec_class_init (GstA52DecClass * klass)
|
|
|
|
{
|
|
|
|
GObjectClass *gobject_class;
|
|
|
|
GstElementClass *gstelement_class;
|
2005-10-20 09:51:58 +00:00
|
|
|
guint cpuflags;
|
2001-12-26 21:51:41 +00:00
|
|
|
|
|
|
|
gobject_class = (GObjectClass *) klass;
|
|
|
|
gstelement_class = (GstElementClass *) klass;
|
|
|
|
|
|
|
|
gobject_class->set_property = gst_a52dec_set_property;
|
|
|
|
gobject_class->get_property = gst_a52dec_get_property;
|
|
|
|
|
2005-10-20 09:00:30 +00:00
|
|
|
gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_a52dec_change_state);
|
|
|
|
|
2009-05-18 23:51:49 +00:00
|
|
|
/**
|
|
|
|
* GstA52Dec::drc
|
|
|
|
*
|
|
|
|
* Set to true to apply the recommended Dolby Digital dynamic range compression
|
|
|
|
* to the audio stream. Dynamic range compression makes loud sounds
|
|
|
|
* softer and soft sounds louder, so you can more easily listen
|
|
|
|
* to the stream without disturbing other people.
|
|
|
|
*/
|
2005-10-20 09:00:30 +00:00
|
|
|
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_DRC,
|
|
|
|
g_param_spec_boolean ("drc", "Dynamic Range Compression",
|
|
|
|
"Use Dynamic Range Compression", FALSE, G_PARAM_READWRITE));
|
2009-05-18 23:51:49 +00:00
|
|
|
/**
|
|
|
|
* GstA52Dec::mode
|
|
|
|
*
|
|
|
|
* Force a particular output channel configuration from the decoder. By default,
|
|
|
|
* the channel downmix (if any) is chosen automatically based on the downstream
|
|
|
|
* capabilities of the pipeline.
|
|
|
|
*/
|
ext/a52dec/gsta52dec.*: Add two things to a52dec: configure the exact output format for ac3 decoding through properti...
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_mode_get_type),
(gst_a52dec_class_init), (gst_a52dec_init), (gst_a52dec_channels),
(gst_a52dec_handle_frame), (gst_a52dec_change_state),
(gst_a52dec_set_property), (gst_a52dec_get_property):
* ext/a52dec/gsta52dec.h:
Patch from from Michal Benes <michal.benes@itonis.tv>:
Add two things to a52dec: configure the exact output format for ac3
decoding through properties, if desired.
By default, configure an output format preferred by downstream. Now
that audioconvert lists caps by preference, this means that a52dec
can do downmixing (iff required) rather than audioconvert, so it can
use the ac3 downmix levels from the bitstream.
2006-09-01 16:21:43 +00:00
|
|
|
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_MODE,
|
|
|
|
g_param_spec_enum ("mode", "Decoder Mode", "Decoding Mode (default 3f2r)",
|
|
|
|
GST_TYPE_A52DEC_MODE, A52_3F2R, G_PARAM_READWRITE));
|
2009-05-18 23:51:49 +00:00
|
|
|
/**
|
|
|
|
* GstA52Dec::lfe
|
|
|
|
*
|
|
|
|
* Whether to output the LFE (Low Frequency Emitter) channel of the audio stream.
|
|
|
|
*/
|
ext/a52dec/gsta52dec.*: Add two things to a52dec: configure the exact output format for ac3 decoding through properti...
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_mode_get_type),
(gst_a52dec_class_init), (gst_a52dec_init), (gst_a52dec_channels),
(gst_a52dec_handle_frame), (gst_a52dec_change_state),
(gst_a52dec_set_property), (gst_a52dec_get_property):
* ext/a52dec/gsta52dec.h:
Patch from from Michal Benes <michal.benes@itonis.tv>:
Add two things to a52dec: configure the exact output format for ac3
decoding through properties, if desired.
By default, configure an output format preferred by downstream. Now
that audioconvert lists caps by preference, this means that a52dec
can do downmixing (iff required) rather than audioconvert, so it can
use the ac3 downmix levels from the bitstream.
2006-09-01 16:21:43 +00:00
|
|
|
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LFE,
|
|
|
|
g_param_spec_boolean ("lfe", "LFE", "LFE", TRUE, G_PARAM_READWRITE));
|
2005-10-20 09:51:58 +00:00
|
|
|
|
2009-08-23 11:34:32 +00:00
|
|
|
/* If no CPU instruction based acceleration is available, end up using the
|
|
|
|
* generic software djbfft based one when available in the used liba52 */
|
2009-08-23 11:35:46 +00:00
|
|
|
#ifdef MM_ACCEL_DJBFFT
|
2009-08-23 11:34:32 +00:00
|
|
|
klass->a52_cpuflags = MM_ACCEL_DJBFFT;
|
2009-08-23 11:35:46 +00:00
|
|
|
#else
|
|
|
|
klass->a52_cpuflags = 0;
|
|
|
|
#endif
|
2010-06-14 12:34:25 +00:00
|
|
|
|
|
|
|
#if HAVE_ORC
|
|
|
|
cpuflags = orc_target_get_default_flags (orc_target_get_by_name ("mmx"));
|
|
|
|
|
|
|
|
if (cpuflags & ORC_TARGET_MMX_MMX)
|
2005-10-20 09:51:58 +00:00
|
|
|
klass->a52_cpuflags |= MM_ACCEL_X86_MMX;
|
2010-06-14 12:34:25 +00:00
|
|
|
if (cpuflags & ORC_TARGET_MMX_3DNOW)
|
2005-10-20 09:51:58 +00:00
|
|
|
klass->a52_cpuflags |= MM_ACCEL_X86_3DNOW;
|
2010-06-14 12:34:25 +00:00
|
|
|
if (cpuflags & ORC_TARGET_MMX_MMXEXT)
|
2005-10-20 09:51:58 +00:00
|
|
|
klass->a52_cpuflags |= MM_ACCEL_X86_MMXEXT;
|
2010-06-14 12:34:25 +00:00
|
|
|
#else
|
|
|
|
cpuflags = 0;
|
|
|
|
#endif
|
|
|
|
|
2005-10-20 09:51:58 +00:00
|
|
|
GST_LOG ("CPU flags: a52=%08x, liboil=%08x", klass->a52_cpuflags, cpuflags);
|
2001-12-26 21:51:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2009-05-18 23:51:49 +00:00
|
|
|
gst_a52dec_init (GstA52Dec * a52dec, GstA52DecClass * g_class)
|
2001-12-26 21:51:41 +00:00
|
|
|
{
|
|
|
|
/* create the sink and src pads */
|
2009-05-18 23:51:49 +00:00
|
|
|
a52dec->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink");
|
2005-11-25 14:50:19 +00:00
|
|
|
gst_pad_set_setcaps_function (a52dec->sinkpad,
|
|
|
|
GST_DEBUG_FUNCPTR (gst_a52dec_sink_setcaps));
|
2005-10-20 09:00:30 +00:00
|
|
|
gst_pad_set_chain_function (a52dec->sinkpad,
|
|
|
|
GST_DEBUG_FUNCPTR (gst_a52dec_chain));
|
|
|
|
gst_pad_set_event_function (a52dec->sinkpad,
|
|
|
|
GST_DEBUG_FUNCPTR (gst_a52dec_sink_event));
|
2001-12-26 21:51:41 +00:00
|
|
|
gst_element_add_pad (GST_ELEMENT (a52dec), a52dec->sinkpad);
|
|
|
|
|
2009-05-18 23:51:49 +00:00
|
|
|
a52dec->srcpad = gst_pad_new_from_static_template (&src_factory, "src");
|
2001-12-26 21:51:41 +00:00
|
|
|
gst_element_add_pad (GST_ELEMENT (a52dec), a52dec->srcpad);
|
|
|
|
|
ext/a52dec/gsta52dec.*: Add two things to a52dec: configure the exact output format for ac3 decoding through properti...
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_mode_get_type),
(gst_a52dec_class_init), (gst_a52dec_init), (gst_a52dec_channels),
(gst_a52dec_handle_frame), (gst_a52dec_change_state),
(gst_a52dec_set_property), (gst_a52dec_get_property):
* ext/a52dec/gsta52dec.h:
Patch from from Michal Benes <michal.benes@itonis.tv>:
Add two things to a52dec: configure the exact output format for ac3
decoding through properties, if desired.
By default, configure an output format preferred by downstream. Now
that audioconvert lists caps by preference, this means that a52dec
can do downmixing (iff required) rather than audioconvert, so it can
use the ac3 downmix levels from the bitstream.
2006-09-01 16:21:43 +00:00
|
|
|
a52dec->request_channels = A52_CHANNEL;
|
2001-12-26 21:51:41 +00:00
|
|
|
a52dec->dynamic_range_compression = FALSE;
|
2009-05-18 23:51:49 +00:00
|
|
|
|
2008-05-26 09:06:54 +00:00
|
|
|
gst_segment_init (&a52dec->segment, GST_FORMAT_UNDEFINED);
|
2001-12-26 21:51:41 +00:00
|
|
|
}
|
|
|
|
|
2009-05-18 23:51:49 +00:00
|
|
|
static gint
|
2004-11-27 19:41:26 +00:00
|
|
|
gst_a52dec_channels (int flags, GstAudioChannelPosition ** _pos)
|
2001-12-26 21:51:41 +00:00
|
|
|
{
|
2009-05-18 23:51:49 +00:00
|
|
|
gint chans = 0;
|
2004-11-27 19:41:26 +00:00
|
|
|
GstAudioChannelPosition *pos = NULL;
|
2001-12-26 21:51:41 +00:00
|
|
|
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
/* allocated just for safety. Number makes no sense */
|
2004-11-27 19:41:26 +00:00
|
|
|
if (_pos) {
|
|
|
|
pos = g_new (GstAudioChannelPosition, 6);
|
|
|
|
*_pos = pos;
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
}
|
|
|
|
|
2001-12-26 21:51:41 +00:00
|
|
|
if (flags & A52_LFE) {
|
|
|
|
chans += 1;
|
2004-11-27 19:41:26 +00:00
|
|
|
if (pos) {
|
|
|
|
pos[0] = GST_AUDIO_CHANNEL_POSITION_LFE;
|
|
|
|
}
|
2001-12-26 21:51:41 +00:00
|
|
|
}
|
|
|
|
flags &= A52_CHANNEL_MASK;
|
|
|
|
switch (flags) {
|
|
|
|
case A52_3F2R:
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
if (pos) {
|
2004-11-27 19:41:26 +00:00
|
|
|
pos[0 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT;
|
|
|
|
pos[1 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER;
|
|
|
|
pos[2 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT;
|
|
|
|
pos[3 + chans] = GST_AUDIO_CHANNEL_POSITION_REAR_LEFT;
|
|
|
|
pos[4 + chans] = GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT;
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
}
|
2001-12-26 21:51:41 +00:00
|
|
|
chans += 5;
|
|
|
|
break;
|
|
|
|
case A52_2F2R:
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
if (pos) {
|
2004-11-27 19:41:26 +00:00
|
|
|
pos[0 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT;
|
|
|
|
pos[1 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT;
|
|
|
|
pos[2 + chans] = GST_AUDIO_CHANNEL_POSITION_REAR_LEFT;
|
|
|
|
pos[3 + chans] = GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT;
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
}
|
|
|
|
chans += 4;
|
|
|
|
break;
|
2001-12-26 21:51:41 +00:00
|
|
|
case A52_3F1R:
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
if (pos) {
|
2004-11-27 19:41:26 +00:00
|
|
|
pos[0 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT;
|
|
|
|
pos[1 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER;
|
|
|
|
pos[2 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT;
|
|
|
|
pos[3 + chans] = GST_AUDIO_CHANNEL_POSITION_REAR_CENTER;
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
}
|
2001-12-26 21:51:41 +00:00
|
|
|
chans += 4;
|
|
|
|
break;
|
|
|
|
case A52_2F1R:
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
if (pos) {
|
2004-11-27 19:41:26 +00:00
|
|
|
pos[0 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT;
|
|
|
|
pos[1 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT;
|
|
|
|
pos[2 + chans] = GST_AUDIO_CHANNEL_POSITION_REAR_CENTER;
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
}
|
|
|
|
chans += 3;
|
|
|
|
break;
|
2001-12-26 21:51:41 +00:00
|
|
|
case A52_3F:
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
if (pos) {
|
2004-11-27 19:41:26 +00:00
|
|
|
pos[0 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT;
|
|
|
|
pos[1 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER;
|
|
|
|
pos[2 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT;
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
}
|
2001-12-26 21:51:41 +00:00
|
|
|
chans += 3;
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
break;
|
2006-06-23 09:28:28 +00:00
|
|
|
case A52_CHANNEL: /* Dual mono. Should really be handled as 2 src pads */
|
2001-12-26 21:51:41 +00:00
|
|
|
case A52_STEREO:
|
|
|
|
case A52_DOLBY:
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
if (pos) {
|
2004-11-27 19:41:26 +00:00
|
|
|
pos[0 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT;
|
|
|
|
pos[1 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT;
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
}
|
2001-12-26 21:51:41 +00:00
|
|
|
chans += 2;
|
|
|
|
break;
|
ext/a52dec/gsta52dec.*: Add two things to a52dec: configure the exact output format for ac3 decoding through properti...
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_mode_get_type),
(gst_a52dec_class_init), (gst_a52dec_init), (gst_a52dec_channels),
(gst_a52dec_handle_frame), (gst_a52dec_change_state),
(gst_a52dec_set_property), (gst_a52dec_get_property):
* ext/a52dec/gsta52dec.h:
Patch from from Michal Benes <michal.benes@itonis.tv>:
Add two things to a52dec: configure the exact output format for ac3
decoding through properties, if desired.
By default, configure an output format preferred by downstream. Now
that audioconvert lists caps by preference, this means that a52dec
can do downmixing (iff required) rather than audioconvert, so it can
use the ac3 downmix levels from the bitstream.
2006-09-01 16:21:43 +00:00
|
|
|
case A52_MONO:
|
|
|
|
if (pos) {
|
|
|
|
pos[0 + chans] = GST_AUDIO_CHANNEL_POSITION_FRONT_MONO;
|
|
|
|
}
|
|
|
|
chans += 1;
|
|
|
|
break;
|
2001-12-26 21:51:41 +00:00
|
|
|
default:
|
2006-08-07 14:01:33 +00:00
|
|
|
/* error, caller should post error message */
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
g_free (pos);
|
2001-12-26 21:51:41 +00:00
|
|
|
return 0;
|
|
|
|
}
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
|
2001-12-26 21:51:41 +00:00
|
|
|
return chans;
|
|
|
|
}
|
|
|
|
|
2008-06-02 11:59:07 +00:00
|
|
|
static void
|
|
|
|
clear_queued (GstA52Dec * dec)
|
|
|
|
{
|
|
|
|
g_list_foreach (dec->queued, (GFunc) gst_mini_object_unref, NULL);
|
|
|
|
g_list_free (dec->queued);
|
|
|
|
dec->queued = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static GstFlowReturn
|
|
|
|
flush_queued (GstA52Dec * dec)
|
|
|
|
{
|
|
|
|
GstFlowReturn ret = GST_FLOW_OK;
|
|
|
|
|
|
|
|
while (dec->queued) {
|
|
|
|
GstBuffer *buf = GST_BUFFER_CAST (dec->queued->data);
|
|
|
|
|
|
|
|
GST_LOG_OBJECT (dec, "pushing buffer %p, timestamp %"
|
|
|
|
GST_TIME_FORMAT ", duration %" GST_TIME_FORMAT, buf,
|
|
|
|
GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
|
|
|
|
GST_TIME_ARGS (GST_BUFFER_DURATION (buf)));
|
|
|
|
|
|
|
|
/* iterate ouput queue an push downstream */
|
|
|
|
ret = gst_pad_push (dec->srcpad, buf);
|
|
|
|
|
|
|
|
dec->queued = g_list_delete_link (dec->queued, dec->queued);
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static GstFlowReturn
|
|
|
|
gst_a52dec_drain (GstA52Dec * dec)
|
|
|
|
{
|
|
|
|
GstFlowReturn ret = GST_FLOW_OK;
|
|
|
|
|
|
|
|
if (dec->segment.rate < 0.0) {
|
|
|
|
/* if we have some queued frames for reverse playback, flush
|
|
|
|
* them now */
|
|
|
|
ret = flush_queued (dec);
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2005-10-20 09:00:30 +00:00
|
|
|
static GstFlowReturn
|
examples/gstplay/player.c: Don't iterate.
Original commit message from CVS:
* examples/gstplay/player.c: (main):
Don't iterate.
* examples/seeking/seek.c: (fixate), (make_playerbin_pipeline):
Add visualizations.
* ext/a52dec/gsta52dec.c: (gst_a52dec_push),
(gst_a52dec_handle_frame):
Set duration.
* ext/dvdnav/gst-dvd:
Add audioconvert. Fixes #161325.
* ext/dvdread/dvdreadsrc.c: (dvdreadsrc_get):
Explicitely case to gint64. Possible valgrind error.
* gst-libs/gst/play/play.c: (caps_set), (setup_size),
(gst_play_tick_callback), (gst_play_change_state),
(gst_play_dispose), (gst_play_init), (gst_play_class_init),
(gst_play_set_location), (gst_play_get_location),
(gst_play_seek_to_time), (gst_play_set_data_src),
(gst_play_set_video_sink), (gst_play_set_audio_sink),
(gst_play_set_visualization), (gst_play_connect_visualization),
(gst_play_get_framerate), (gst_play_get_all_by_interface),
(gst_play_new):
Use playbin. Fixes #139749 and #147744.
* gst/apetag/apedemux.c: (gst_ape_demux_parse_tags):
Add genre tag.
* gst/audioscale/gstaudioscale.c: (gst_audioscale_method_get_type),
(audioscale_get_type), (gst_audioscale_base_init),
(gst_audioscale_class_init), (gst_audioscale_expand_caps),
(gst_audioscale_getcaps), (gst_audioscale_fixate),
(gst_audioscale_link), (gst_audioscale_get_buffer),
(gst_audioscale_decrease_rate), (gst_audioscale_increase_rate),
(gst_audioscale_init), (gst_audioscale_dispose),
(gst_audioscale_chain), (gst_audioscale_set_property),
(gst_audioscale_get_property), (plugin_init):
Indent properly.
* gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_process_private):
Fix LPCM.
* gst/qtdemux/qtdemux.c: (qtdemux_parse_udta),
(qtdemux_tag_add_str), (qtdemux_tag_add_num),
(qtdemux_tag_add_gnre), (qtdemux_video_caps):
Add more metadata (fixes #162656).
2005-01-05 14:56:27 +00:00
|
|
|
gst_a52dec_push (GstA52Dec * a52dec,
|
|
|
|
GstPad * srcpad, int flags, sample_t * samples, GstClockTime timestamp)
|
2001-12-26 21:51:41 +00:00
|
|
|
{
|
|
|
|
GstBuffer *buf;
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
int chans, n, c;
|
2005-10-20 09:00:30 +00:00
|
|
|
GstFlowReturn result;
|
2001-12-26 21:51:41 +00:00
|
|
|
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
flags &= (A52_CHANNEL_MASK | A52_LFE);
|
|
|
|
chans = gst_a52dec_channels (flags, NULL);
|
2001-12-26 21:51:41 +00:00
|
|
|
if (!chans) {
|
2006-08-07 14:01:33 +00:00
|
|
|
GST_ELEMENT_ERROR (GST_ELEMENT (a52dec), STREAM, DECODE, (NULL),
|
|
|
|
("invalid channel flags: %d", flags));
|
2005-10-20 09:00:30 +00:00
|
|
|
return GST_FLOW_ERROR;
|
2001-12-26 21:51:41 +00:00
|
|
|
}
|
|
|
|
|
2005-12-05 13:03:40 +00:00
|
|
|
result =
|
|
|
|
gst_pad_alloc_buffer_and_set_caps (srcpad, 0,
|
|
|
|
256 * chans * (SAMPLE_WIDTH / 8), GST_PAD_CAPS (srcpad), &buf);
|
2005-10-20 09:00:30 +00:00
|
|
|
if (result != GST_FLOW_OK)
|
|
|
|
return result;
|
|
|
|
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
for (n = 0; n < 256; n++) {
|
|
|
|
for (c = 0; c < chans; c++) {
|
|
|
|
((sample_t *) GST_BUFFER_DATA (buf))[n * chans + c] =
|
|
|
|
samples[c * 256 + n];
|
|
|
|
}
|
|
|
|
}
|
2001-12-26 21:51:41 +00:00
|
|
|
GST_BUFFER_TIMESTAMP (buf) = timestamp;
|
examples/gstplay/player.c: Don't iterate.
Original commit message from CVS:
* examples/gstplay/player.c: (main):
Don't iterate.
* examples/seeking/seek.c: (fixate), (make_playerbin_pipeline):
Add visualizations.
* ext/a52dec/gsta52dec.c: (gst_a52dec_push),
(gst_a52dec_handle_frame):
Set duration.
* ext/dvdnav/gst-dvd:
Add audioconvert. Fixes #161325.
* ext/dvdread/dvdreadsrc.c: (dvdreadsrc_get):
Explicitely case to gint64. Possible valgrind error.
* gst-libs/gst/play/play.c: (caps_set), (setup_size),
(gst_play_tick_callback), (gst_play_change_state),
(gst_play_dispose), (gst_play_init), (gst_play_class_init),
(gst_play_set_location), (gst_play_get_location),
(gst_play_seek_to_time), (gst_play_set_data_src),
(gst_play_set_video_sink), (gst_play_set_audio_sink),
(gst_play_set_visualization), (gst_play_connect_visualization),
(gst_play_get_framerate), (gst_play_get_all_by_interface),
(gst_play_new):
Use playbin. Fixes #139749 and #147744.
* gst/apetag/apedemux.c: (gst_ape_demux_parse_tags):
Add genre tag.
* gst/audioscale/gstaudioscale.c: (gst_audioscale_method_get_type),
(audioscale_get_type), (gst_audioscale_base_init),
(gst_audioscale_class_init), (gst_audioscale_expand_caps),
(gst_audioscale_getcaps), (gst_audioscale_fixate),
(gst_audioscale_link), (gst_audioscale_get_buffer),
(gst_audioscale_decrease_rate), (gst_audioscale_increase_rate),
(gst_audioscale_init), (gst_audioscale_dispose),
(gst_audioscale_chain), (gst_audioscale_set_property),
(gst_audioscale_get_property), (plugin_init):
Indent properly.
* gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_process_private):
Fix LPCM.
* gst/qtdemux/qtdemux.c: (qtdemux_parse_udta),
(qtdemux_tag_add_str), (qtdemux_tag_add_num),
(qtdemux_tag_add_gnre), (qtdemux_video_caps):
Add more metadata (fixes #162656).
2005-01-05 14:56:27 +00:00
|
|
|
GST_BUFFER_DURATION (buf) = 256 * GST_SECOND / a52dec->sample_rate;
|
2001-12-26 21:51:41 +00:00
|
|
|
|
2008-06-02 11:59:07 +00:00
|
|
|
result = GST_FLOW_OK;
|
|
|
|
if ((buf = gst_audio_buffer_clip (buf, &a52dec->segment,
|
|
|
|
a52dec->sample_rate, (SAMPLE_WIDTH / 8) * chans))) {
|
|
|
|
/* set discont when needed */
|
|
|
|
if (a52dec->discont) {
|
|
|
|
GST_LOG_OBJECT (a52dec, "marking DISCONT");
|
|
|
|
GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
|
|
|
|
a52dec->discont = FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (a52dec->segment.rate > 0.0) {
|
|
|
|
GST_DEBUG_OBJECT (a52dec,
|
|
|
|
"Pushing buffer with ts %" GST_TIME_FORMAT " duration %"
|
|
|
|
GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
|
|
|
|
GST_TIME_ARGS (GST_BUFFER_DURATION (buf)));
|
ext/a52dec/gsta52dec.c: Add some debug output. Check that a discont has a valid time associated.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_push),
(gst_a52dec_handle_event), (gst_a52dec_chain):
Add some debug output. Check that a discont has a valid
time associated.
* ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event),
(gst_alsa_sink_loop):
Ignore TAG events. A little extra debug for broken timestamps.
* ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_init), (dvdnavsrc_loop),
(dvdnavsrc_change_state):
Ensure we send a discont to engage the link before we send any
other events.
* ext/dvdread/dvdreadsrc.c: (dvdreadsrc_init),
(dvdreadsrc_finalize), (_close), (_open), (_seek_title),
(_seek_chapter), (seek_sector), (dvdreadsrc_get),
(dvdreadsrc_uri_get_uri), (dvdreadsrc_uri_set_uri):
Handle URI of the form dvd://title[,chapter[,angle]]. Currently only
dvd://title works in totem because typefinding sends a seek that ends
up going back to chapter 1 regardless.
* ext/mpeg2dec/gstmpeg2dec.c:
* ext/mpeg2dec/gstmpeg2dec.h:
Output correct timestamps and handle disconts.
* ext/ogg/gstoggdemux.c: (get_relative):
Small guard against a null dereference.
* ext/pango/gsttextoverlay.c: (gst_textoverlay_finalize),
(gst_textoverlay_set_property):
Free memory when done. Don't call gst_event_filler_get_duration on
EOS events. Use GST_LOG and GST_WARNING instead of g_message and
g_warning.
* ext/smoothwave/gstsmoothwave.c: (gst_smoothwave_init),
(draw_line), (gst_smoothwave_dispose), (gst_sw_sinklink),
(gst_sw_srclink), (gst_smoothwave_chain):
Draw solid lines, prettier colours.
* gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_init):
Add a default palette that'll work for some movies.
* gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_init),
(gst_dvd_demux_handle_dvd_event), (gst_dvd_demux_send_discont),
(gst_dvd_demux_send_subbuffer), (gst_dvd_demux_reset):
* gst/mpegstream/gstdvddemux.h:
* gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_discont),
(gst_mpeg_demux_parse_syshead), (gst_mpeg_demux_parse_pes):
* gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_init),
(gst_mpeg_parse_handle_discont), (gst_mpeg_parse_parse_packhead):
* gst/mpegstream/gstmpegparse.h:
Use PTM/NAV events when for timestamp adjustment when connected to
dvdnavsrc. Don't use many discont events where one suffices.
* gst/playback/gstplaybasebin.c: (group_destroy),
(gen_preroll_element), (gst_play_base_bin_add_element):
* gst/playback/gstplaybasebin.h:
Make sure we remove subtitles from the same bin we put them in.
* gst/subparse/gstsubparse.c: (convert_encoding), (parse_subrip),
(gst_subparse_buffer_format_autodetect),
(gst_subparse_change_state):
Fix some memleaks and invalid accesses.
* gst/typefind/gsttypefindfunctions.c: (ogganx_type_find),
(oggskel_type_find), (cmml_type_find), (plugin_init):
Some typefind functions for Annodex v3.0 files
* gst/wavparse/gstwavparse.h:
GstRiffReadClass is the correct parent class.
2005-01-25 15:34:08 +00:00
|
|
|
|
2008-06-02 11:59:07 +00:00
|
|
|
result = gst_pad_push (srcpad, buf);
|
|
|
|
} else {
|
|
|
|
/* reverse playback, queue frame till later when we get a discont. */
|
|
|
|
GST_DEBUG_OBJECT (a52dec, "queued frame");
|
|
|
|
a52dec->queued = g_list_prepend (a52dec->queued, buf);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return result;
|
2001-12-26 21:51:41 +00:00
|
|
|
}
|
|
|
|
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
static gboolean
|
2006-08-07 14:01:33 +00:00
|
|
|
gst_a52dec_reneg (GstA52Dec * a52dec, GstPad * pad)
|
2001-12-26 21:51:41 +00:00
|
|
|
{
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
GstAudioChannelPosition *pos;
|
|
|
|
gint channels = gst_a52dec_channels (a52dec->using_channels, &pos);
|
2005-10-20 09:00:30 +00:00
|
|
|
GstCaps *caps = NULL;
|
|
|
|
gboolean result = FALSE;
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
|
|
|
|
if (!channels)
|
2005-10-20 09:00:30 +00:00
|
|
|
goto done;
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
|
2006-08-07 14:01:33 +00:00
|
|
|
GST_INFO_OBJECT (a52dec, "reneg channels:%d rate:%d",
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
channels, a52dec->sample_rate);
|
|
|
|
|
|
|
|
caps = gst_caps_new_simple ("audio/x-raw-float",
|
|
|
|
"endianness", G_TYPE_INT, G_BYTE_ORDER,
|
|
|
|
"width", G_TYPE_INT, SAMPLE_WIDTH,
|
|
|
|
"channels", G_TYPE_INT, channels,
|
2005-10-20 09:00:30 +00:00
|
|
|
"rate", G_TYPE_INT, a52dec->sample_rate, NULL);
|
Surround sound support.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_channels), (gst_a52dec_push),
(gst_a52dec_reneg), (gst_a52dec_loop), (plugin_init):
* ext/alsa/gstalsa.c: (gst_alsa_get_caps):
* ext/alsa/gstalsaplugin.c: (plugin_init):
* ext/dts/gstdtsdec.c: (gst_dtsdec_channels),
(gst_dtsdec_renegotiate), (gst_dtsdec_loop), (plugin_init):
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_chanpos_from_gst),
(gst_faad_chanpos_to_gst), (gst_faad_sinkconnect),
(gst_faad_srcgetcaps), (gst_faad_srcconnect), (gst_faad_chain),
(gst_faad_change_state), (plugin_init):
* ext/faad/gstfaad.h:
* ext/vorbis/vorbis.c: (plugin_init):
* ext/vorbis/vorbisdec.c: (vorbis_dec_chain):
* gst-libs/gst/audio/Makefile.am:
* gst-libs/gst/audio/audio.c: (plugin_init):
* gst-libs/gst/audio/multichannel.c:
(gst_audio_check_channel_positions),
(gst_audio_get_channel_positions),
(gst_audio_set_channel_positions),
(gst_audio_set_structure_channel_positions_list),
(add_list_to_struct), (gst_audio_set_caps_channel_positions_list),
(gst_audio_fixate_channel_positions):
* gst-libs/gst/audio/multichannel.h:
* gst-libs/gst/audio/testchannels.c: (main):
* gst/audioconvert/gstaudioconvert.c:
(gst_audio_convert_class_init), (gst_audio_convert_init),
(gst_audio_convert_dispose), (gst_audio_convert_getcaps),
(gst_audio_convert_parse_caps), (gst_audio_convert_link),
(gst_audio_convert_fixate), (gst_audio_convert_channels):
* gst/audioconvert/plugin.c: (plugin_init):
Surround sound support.
2004-11-25 20:36:29 +00:00
|
|
|
gst_audio_set_channel_positions (gst_caps_get_structure (caps, 0), pos);
|
|
|
|
g_free (pos);
|
|
|
|
|
2005-10-20 09:00:30 +00:00
|
|
|
if (!gst_pad_set_caps (pad, caps))
|
|
|
|
goto done;
|
|
|
|
|
|
|
|
result = TRUE;
|
|
|
|
|
|
|
|
done:
|
|
|
|
if (caps)
|
|
|
|
gst_caps_unref (caps);
|
|
|
|
return result;
|
2001-12-26 21:51:41 +00:00
|
|
|
}
|
|
|
|
|
2005-10-20 09:00:30 +00:00
|
|
|
static gboolean
|
|
|
|
gst_a52dec_sink_event (GstPad * pad, GstEvent * event)
|
2001-12-26 21:51:41 +00:00
|
|
|
{
|
2005-10-20 09:00:30 +00:00
|
|
|
GstA52Dec *a52dec = GST_A52DEC (gst_pad_get_parent (pad));
|
2005-10-20 09:51:58 +00:00
|
|
|
gboolean ret = FALSE;
|
2005-10-20 09:00:30 +00:00
|
|
|
|
2005-10-20 09:51:58 +00:00
|
|
|
GST_LOG ("Handling %s event", GST_EVENT_TYPE_NAME (event));
|
2004-12-06 10:28:13 +00:00
|
|
|
|
2001-12-26 21:51:41 +00:00
|
|
|
switch (GST_EVENT_TYPE (event)) {
|
2008-06-02 11:59:07 +00:00
|
|
|
case GST_EVENT_NEWSEGMENT:
|
|
|
|
{
|
|
|
|
GstFormat fmt;
|
|
|
|
gboolean update;
|
|
|
|
gint64 start, end, pos;
|
2009-09-15 23:00:28 +00:00
|
|
|
gdouble rate, arate;
|
2004-12-06 10:28:13 +00:00
|
|
|
|
2009-09-15 23:00:28 +00:00
|
|
|
gst_event_parse_new_segment_full (event, &update, &rate, &arate, &fmt,
|
|
|
|
&start, &end, &pos);
|
2008-06-02 11:59:07 +00:00
|
|
|
|
2008-06-02 15:44:57 +00:00
|
|
|
/* drain queued buffers before activating the segment so that we can clip
|
|
|
|
* against the old segment first */
|
|
|
|
gst_a52dec_drain (a52dec);
|
|
|
|
|
2008-06-02 11:59:07 +00:00
|
|
|
if (fmt != GST_FORMAT_TIME || !GST_CLOCK_TIME_IS_VALID (start)) {
|
2008-05-28 11:43:01 +00:00
|
|
|
GST_WARNING ("No time in newsegment event %p (format is %s)",
|
2008-06-02 11:59:07 +00:00
|
|
|
event, gst_format_get_name (fmt));
|
2006-08-14 10:19:41 +00:00
|
|
|
gst_event_unref (event);
|
|
|
|
a52dec->sent_segment = FALSE;
|
2008-08-26 15:35:43 +00:00
|
|
|
/* set some dummy values, FIXME: do proper conversion */
|
|
|
|
a52dec->time = start = pos = 0;
|
|
|
|
fmt = GST_FORMAT_TIME;
|
|
|
|
end = -1;
|
2004-12-06 10:28:13 +00:00
|
|
|
} else {
|
2008-06-02 11:59:07 +00:00
|
|
|
a52dec->time = start;
|
2006-03-15 22:01:40 +00:00
|
|
|
a52dec->sent_segment = TRUE;
|
2009-09-15 23:00:28 +00:00
|
|
|
GST_DEBUG_OBJECT (a52dec,
|
|
|
|
"Pushing newseg rate %g, applied rate %g, format %d, start %"
|
|
|
|
G_GINT64_FORMAT ", stop %" G_GINT64_FORMAT ", pos %"
|
2009-11-04 15:52:09 +00:00
|
|
|
G_GINT64_FORMAT, rate, arate, fmt, start, end, pos);
|
2009-09-15 23:00:28 +00:00
|
|
|
|
2008-05-26 09:06:54 +00:00
|
|
|
ret = gst_pad_push_event (a52dec->srcpad, event);
|
2005-10-20 09:00:30 +00:00
|
|
|
}
|
2008-06-02 11:59:07 +00:00
|
|
|
|
|
|
|
gst_segment_set_newsegment (&a52dec->segment, update, rate, fmt, start,
|
|
|
|
end, pos);
|
2005-10-20 09:00:30 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case GST_EVENT_TAG:
|
2008-06-02 11:59:07 +00:00
|
|
|
ret = gst_pad_push_event (a52dec->srcpad, event);
|
|
|
|
break;
|
2008-05-26 09:06:54 +00:00
|
|
|
case GST_EVENT_EOS:
|
2008-06-02 11:59:07 +00:00
|
|
|
gst_a52dec_drain (a52dec);
|
2008-05-26 09:06:54 +00:00
|
|
|
ret = gst_pad_push_event (a52dec->srcpad, event);
|
2005-10-20 09:00:30 +00:00
|
|
|
break;
|
|
|
|
case GST_EVENT_FLUSH_START:
|
2008-05-26 09:06:54 +00:00
|
|
|
ret = gst_pad_push_event (a52dec->srcpad, event);
|
2005-10-20 09:00:30 +00:00
|
|
|
break;
|
|
|
|
case GST_EVENT_FLUSH_STOP:
|
2004-12-06 10:28:13 +00:00
|
|
|
if (a52dec->cache) {
|
|
|
|
gst_buffer_unref (a52dec->cache);
|
|
|
|
a52dec->cache = NULL;
|
|
|
|
}
|
2008-06-02 11:59:07 +00:00
|
|
|
clear_queued (a52dec);
|
2008-05-26 09:06:54 +00:00
|
|
|
gst_segment_init (&a52dec->segment, GST_FORMAT_UNDEFINED);
|
|
|
|
ret = gst_pad_push_event (a52dec->srcpad, event);
|
2004-04-01 11:48:27 +00:00
|
|
|
break;
|
2001-12-26 21:51:41 +00:00
|
|
|
default:
|
2008-05-26 09:06:54 +00:00
|
|
|
ret = gst_pad_push_event (a52dec->srcpad, event);
|
2001-12-26 21:51:41 +00:00
|
|
|
break;
|
|
|
|
}
|
2004-12-06 10:28:13 +00:00
|
|
|
|
2005-10-20 09:00:30 +00:00
|
|
|
gst_object_unref (a52dec);
|
|
|
|
return ret;
|
2001-12-26 21:51:41 +00:00
|
|
|
}
|
|
|
|
|
2002-12-31 17:03:29 +00:00
|
|
|
static void
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_a52dec_update_streaminfo (GstA52Dec * a52dec)
|
2002-12-31 17:03:29 +00:00
|
|
|
{
|
2004-04-01 11:48:27 +00:00
|
|
|
GstTagList *taglist;
|
2004-03-14 22:34:30 +00:00
|
|
|
|
2004-04-01 11:48:27 +00:00
|
|
|
taglist = gst_tag_list_new ();
|
2002-12-31 17:03:29 +00:00
|
|
|
|
2004-04-01 11:48:27 +00:00
|
|
|
gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND,
|
2009-05-18 23:51:49 +00:00
|
|
|
GST_TAG_AUDIO_CODEC, "Dolby Digital (AC-3)",
|
2004-04-01 11:48:27 +00:00
|
|
|
GST_TAG_BITRATE, (guint) a52dec->bit_rate, NULL);
|
2002-12-31 17:03:29 +00:00
|
|
|
|
2004-04-01 11:48:27 +00:00
|
|
|
gst_element_found_tags_for_pad (GST_ELEMENT (a52dec),
|
2005-10-20 09:00:30 +00:00
|
|
|
GST_PAD (a52dec->srcpad), taglist);
|
2002-12-31 17:03:29 +00:00
|
|
|
}
|
|
|
|
|
2005-10-20 09:00:30 +00:00
|
|
|
static GstFlowReturn
|
2004-12-06 10:28:13 +00:00
|
|
|
gst_a52dec_handle_frame (GstA52Dec * a52dec, guint8 * data,
|
|
|
|
guint length, gint flags, gint sample_rate, gint bit_rate)
|
2001-12-26 21:51:41 +00:00
|
|
|
{
|
2004-12-06 10:28:13 +00:00
|
|
|
gint channels, i;
|
|
|
|
gboolean need_reneg = FALSE;
|
2001-12-26 21:51:41 +00:00
|
|
|
|
2004-12-06 10:28:13 +00:00
|
|
|
/* update stream information, renegotiate or re-streaminfo if needed */
|
2002-09-21 12:07:43 +00:00
|
|
|
need_reneg = FALSE;
|
|
|
|
if (a52dec->sample_rate != sample_rate) {
|
|
|
|
need_reneg = TRUE;
|
2001-12-26 21:51:41 +00:00
|
|
|
a52dec->sample_rate = sample_rate;
|
|
|
|
}
|
|
|
|
|
2004-11-29 11:16:47 +00:00
|
|
|
if (flags) {
|
|
|
|
a52dec->stream_channels = flags & (A52_CHANNEL_MASK | A52_LFE);
|
|
|
|
}
|
2002-09-21 12:07:43 +00:00
|
|
|
|
2002-12-31 17:03:29 +00:00
|
|
|
if (bit_rate != a52dec->bit_rate) {
|
|
|
|
a52dec->bit_rate = bit_rate;
|
2004-04-01 11:48:27 +00:00
|
|
|
gst_a52dec_update_streaminfo (a52dec);
|
2002-12-31 17:03:29 +00:00
|
|
|
}
|
2002-09-21 12:07:43 +00:00
|
|
|
|
ext/a52dec/gsta52dec.*: Add two things to a52dec: configure the exact output format for ac3 decoding through properti...
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_mode_get_type),
(gst_a52dec_class_init), (gst_a52dec_init), (gst_a52dec_channels),
(gst_a52dec_handle_frame), (gst_a52dec_change_state),
(gst_a52dec_set_property), (gst_a52dec_get_property):
* ext/a52dec/gsta52dec.h:
Patch from from Michal Benes <michal.benes@itonis.tv>:
Add two things to a52dec: configure the exact output format for ac3
decoding through properties, if desired.
By default, configure an output format preferred by downstream. Now
that audioconvert lists caps by preference, this means that a52dec
can do downmixing (iff required) rather than audioconvert, so it can
use the ac3 downmix levels from the bitstream.
2006-09-01 16:21:43 +00:00
|
|
|
/* If we haven't had an explicit number of channels chosen through properties
|
|
|
|
* at this point, choose what to downmix to now, based on what the peer will
|
|
|
|
* accept - this allows a52dec to do downmixing in preference to a
|
|
|
|
* downstream element such as audioconvert.
|
|
|
|
*/
|
2008-09-27 00:20:48 +00:00
|
|
|
if (a52dec->request_channels != A52_CHANNEL) {
|
|
|
|
flags = a52dec->request_channels;
|
|
|
|
} else if (a52dec->flag_update) {
|
ext/a52dec/gsta52dec.*: Add two things to a52dec: configure the exact output format for ac3 decoding through properti...
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_mode_get_type),
(gst_a52dec_class_init), (gst_a52dec_init), (gst_a52dec_channels),
(gst_a52dec_handle_frame), (gst_a52dec_change_state),
(gst_a52dec_set_property), (gst_a52dec_get_property):
* ext/a52dec/gsta52dec.h:
Patch from from Michal Benes <michal.benes@itonis.tv>:
Add two things to a52dec: configure the exact output format for ac3
decoding through properties, if desired.
By default, configure an output format preferred by downstream. Now
that audioconvert lists caps by preference, this means that a52dec
can do downmixing (iff required) rather than audioconvert, so it can
use the ac3 downmix levels from the bitstream.
2006-09-01 16:21:43 +00:00
|
|
|
GstCaps *caps;
|
|
|
|
|
2008-09-27 00:20:48 +00:00
|
|
|
a52dec->flag_update = FALSE;
|
|
|
|
|
ext/a52dec/gsta52dec.*: Add two things to a52dec: configure the exact output format for ac3 decoding through properti...
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_mode_get_type),
(gst_a52dec_class_init), (gst_a52dec_init), (gst_a52dec_channels),
(gst_a52dec_handle_frame), (gst_a52dec_change_state),
(gst_a52dec_set_property), (gst_a52dec_get_property):
* ext/a52dec/gsta52dec.h:
Patch from from Michal Benes <michal.benes@itonis.tv>:
Add two things to a52dec: configure the exact output format for ac3
decoding through properties, if desired.
By default, configure an output format preferred by downstream. Now
that audioconvert lists caps by preference, this means that a52dec
can do downmixing (iff required) rather than audioconvert, so it can
use the ac3 downmix levels from the bitstream.
2006-09-01 16:21:43 +00:00
|
|
|
caps = gst_pad_get_allowed_caps (a52dec->srcpad);
|
|
|
|
if (caps && gst_caps_get_size (caps) > 0) {
|
|
|
|
GstCaps *copy = gst_caps_copy_nth (caps, 0);
|
|
|
|
GstStructure *structure = gst_caps_get_structure (copy, 0);
|
|
|
|
gint channels;
|
|
|
|
const int a52_channels[6] = {
|
|
|
|
A52_MONO,
|
|
|
|
A52_STEREO,
|
|
|
|
A52_STEREO | A52_LFE,
|
|
|
|
A52_2F2R,
|
|
|
|
A52_2F2R | A52_LFE,
|
|
|
|
A52_3F2R | A52_LFE,
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Prefer the original number of channels, but fixate to something
|
|
|
|
* preferred (first in the caps) downstream if possible.
|
|
|
|
*/
|
|
|
|
gst_structure_fixate_field_nearest_int (structure, "channels",
|
|
|
|
flags ? gst_a52dec_channels (flags, NULL) : 6);
|
|
|
|
gst_structure_get_int (structure, "channels", &channels);
|
|
|
|
if (channels <= 6)
|
2008-09-27 00:20:48 +00:00
|
|
|
flags = a52_channels[channels - 1];
|
ext/a52dec/gsta52dec.*: Add two things to a52dec: configure the exact output format for ac3 decoding through properti...
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_mode_get_type),
(gst_a52dec_class_init), (gst_a52dec_init), (gst_a52dec_channels),
(gst_a52dec_handle_frame), (gst_a52dec_change_state),
(gst_a52dec_set_property), (gst_a52dec_get_property):
* ext/a52dec/gsta52dec.h:
Patch from from Michal Benes <michal.benes@itonis.tv>:
Add two things to a52dec: configure the exact output format for ac3
decoding through properties, if desired.
By default, configure an output format preferred by downstream. Now
that audioconvert lists caps by preference, this means that a52dec
can do downmixing (iff required) rather than audioconvert, so it can
use the ac3 downmix levels from the bitstream.
2006-09-01 16:21:43 +00:00
|
|
|
else
|
2008-09-27 00:20:48 +00:00
|
|
|
flags = a52_channels[5];
|
ext/a52dec/gsta52dec.*: Add two things to a52dec: configure the exact output format for ac3 decoding through properti...
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_mode_get_type),
(gst_a52dec_class_init), (gst_a52dec_init), (gst_a52dec_channels),
(gst_a52dec_handle_frame), (gst_a52dec_change_state),
(gst_a52dec_set_property), (gst_a52dec_get_property):
* ext/a52dec/gsta52dec.h:
Patch from from Michal Benes <michal.benes@itonis.tv>:
Add two things to a52dec: configure the exact output format for ac3
decoding through properties, if desired.
By default, configure an output format preferred by downstream. Now
that audioconvert lists caps by preference, this means that a52dec
can do downmixing (iff required) rather than audioconvert, so it can
use the ac3 downmix levels from the bitstream.
2006-09-01 16:21:43 +00:00
|
|
|
|
|
|
|
gst_caps_unref (copy);
|
|
|
|
} else if (flags)
|
2008-09-27 00:20:48 +00:00
|
|
|
flags = a52dec->stream_channels;
|
ext/a52dec/gsta52dec.*: Add two things to a52dec: configure the exact output format for ac3 decoding through properti...
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_mode_get_type),
(gst_a52dec_class_init), (gst_a52dec_init), (gst_a52dec_channels),
(gst_a52dec_handle_frame), (gst_a52dec_change_state),
(gst_a52dec_set_property), (gst_a52dec_get_property):
* ext/a52dec/gsta52dec.h:
Patch from from Michal Benes <michal.benes@itonis.tv>:
Add two things to a52dec: configure the exact output format for ac3
decoding through properties, if desired.
By default, configure an output format preferred by downstream. Now
that audioconvert lists caps by preference, this means that a52dec
can do downmixing (iff required) rather than audioconvert, so it can
use the ac3 downmix levels from the bitstream.
2006-09-01 16:21:43 +00:00
|
|
|
else
|
2008-09-27 00:20:48 +00:00
|
|
|
flags = A52_3F2R | A52_LFE;
|
ext/a52dec/gsta52dec.*: Add two things to a52dec: configure the exact output format for ac3 decoding through properti...
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_mode_get_type),
(gst_a52dec_class_init), (gst_a52dec_init), (gst_a52dec_channels),
(gst_a52dec_handle_frame), (gst_a52dec_change_state),
(gst_a52dec_set_property), (gst_a52dec_get_property):
* ext/a52dec/gsta52dec.h:
Patch from from Michal Benes <michal.benes@itonis.tv>:
Add two things to a52dec: configure the exact output format for ac3
decoding through properties, if desired.
By default, configure an output format preferred by downstream. Now
that audioconvert lists caps by preference, this means that a52dec
can do downmixing (iff required) rather than audioconvert, so it can
use the ac3 downmix levels from the bitstream.
2006-09-01 16:21:43 +00:00
|
|
|
|
|
|
|
if (caps)
|
|
|
|
gst_caps_unref (caps);
|
2008-09-27 00:20:48 +00:00
|
|
|
} else {
|
|
|
|
flags = a52dec->using_channels;
|
ext/a52dec/gsta52dec.*: Add two things to a52dec: configure the exact output format for ac3 decoding through properti...
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_mode_get_type),
(gst_a52dec_class_init), (gst_a52dec_init), (gst_a52dec_channels),
(gst_a52dec_handle_frame), (gst_a52dec_change_state),
(gst_a52dec_set_property), (gst_a52dec_get_property):
* ext/a52dec/gsta52dec.h:
Patch from from Michal Benes <michal.benes@itonis.tv>:
Add two things to a52dec: configure the exact output format for ac3
decoding through properties, if desired.
By default, configure an output format preferred by downstream. Now
that audioconvert lists caps by preference, this means that a52dec
can do downmixing (iff required) rather than audioconvert, so it can
use the ac3 downmix levels from the bitstream.
2006-09-01 16:21:43 +00:00
|
|
|
}
|
2001-12-26 21:51:41 +00:00
|
|
|
/* process */
|
2009-05-18 23:51:49 +00:00
|
|
|
flags |= A52_ADJUST_LEVEL;
|
2001-12-26 21:51:41 +00:00
|
|
|
a52dec->level = 1;
|
|
|
|
if (a52_frame (a52dec->state, data, &flags, &a52dec->level, a52dec->bias)) {
|
2004-04-01 11:48:27 +00:00
|
|
|
GST_WARNING ("a52_frame error");
|
2008-05-26 09:06:54 +00:00
|
|
|
a52dec->discont = TRUE;
|
2005-10-20 09:00:30 +00:00
|
|
|
return GST_FLOW_OK;
|
2001-12-26 21:51:41 +00:00
|
|
|
}
|
2004-11-27 20:27:18 +00:00
|
|
|
channels = flags & (A52_CHANNEL_MASK | A52_LFE);
|
2002-09-21 12:07:43 +00:00
|
|
|
if (a52dec->using_channels != channels) {
|
|
|
|
need_reneg = TRUE;
|
|
|
|
a52dec->using_channels = channels;
|
|
|
|
}
|
|
|
|
|
2004-12-06 10:28:13 +00:00
|
|
|
/* negotiate if required */
|
2009-05-18 23:51:49 +00:00
|
|
|
if (need_reneg) {
|
2006-08-07 14:01:33 +00:00
|
|
|
GST_DEBUG ("a52dec reneg: sample_rate:%d stream_chans:%d using_chans:%d",
|
2004-03-15 19:32:25 +00:00
|
|
|
a52dec->sample_rate, a52dec->stream_channels, a52dec->using_channels);
|
2006-08-07 14:01:33 +00:00
|
|
|
if (!gst_a52dec_reneg (a52dec, a52dec->srcpad)) {
|
2004-12-06 10:28:13 +00:00
|
|
|
GST_ELEMENT_ERROR (a52dec, CORE, NEGOTIATION, (NULL), (NULL));
|
2005-10-20 09:00:30 +00:00
|
|
|
return GST_FLOW_ERROR;
|
2004-12-06 10:28:13 +00:00
|
|
|
}
|
2001-12-26 21:51:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (a52dec->dynamic_range_compression == FALSE) {
|
|
|
|
a52_dynrng (a52dec->state, NULL, NULL);
|
|
|
|
}
|
|
|
|
|
2004-12-06 10:28:13 +00:00
|
|
|
/* each frame consists of 6 blocks */
|
2001-12-26 21:51:41 +00:00
|
|
|
for (i = 0; i < 6; i++) {
|
2002-03-21 23:45:58 +00:00
|
|
|
if (a52_block (a52dec->state)) {
|
2008-05-26 09:06:54 +00:00
|
|
|
/* ignore errors but mark a discont */
|
2004-04-01 11:48:27 +00:00
|
|
|
GST_WARNING ("a52_block error %d", i);
|
2008-05-26 09:06:54 +00:00
|
|
|
a52dec->discont = TRUE;
|
2004-12-06 10:28:13 +00:00
|
|
|
} else {
|
2005-10-20 09:00:30 +00:00
|
|
|
GstFlowReturn ret;
|
|
|
|
|
2004-12-06 10:28:13 +00:00
|
|
|
/* push on */
|
2005-10-20 09:00:30 +00:00
|
|
|
ret = gst_a52dec_push (a52dec, a52dec->srcpad, a52dec->using_channels,
|
2004-12-06 10:28:13 +00:00
|
|
|
a52dec->samples, a52dec->time);
|
2005-10-20 09:00:30 +00:00
|
|
|
if (ret != GST_FLOW_OK)
|
|
|
|
return ret;
|
2001-12-26 21:51:41 +00:00
|
|
|
}
|
2004-12-06 10:28:13 +00:00
|
|
|
a52dec->time += 256 * GST_SECOND / a52dec->sample_rate;
|
|
|
|
}
|
2004-04-01 11:48:27 +00:00
|
|
|
|
2005-10-20 09:00:30 +00:00
|
|
|
return GST_FLOW_OK;
|
2004-12-06 10:28:13 +00:00
|
|
|
}
|
2004-04-01 11:48:27 +00:00
|
|
|
|
2005-11-25 14:50:19 +00:00
|
|
|
static gboolean
|
|
|
|
gst_a52dec_sink_setcaps (GstPad * pad, GstCaps * caps)
|
|
|
|
{
|
|
|
|
GstA52Dec *a52dec = GST_A52DEC (gst_pad_get_parent (pad));
|
|
|
|
GstStructure *structure;
|
|
|
|
|
|
|
|
structure = gst_caps_get_structure (caps, 0);
|
|
|
|
|
|
|
|
if (structure && gst_structure_has_name (structure, "audio/x-private1-ac3"))
|
|
|
|
a52dec->dvdmode = TRUE;
|
|
|
|
else
|
|
|
|
a52dec->dvdmode = FALSE;
|
|
|
|
|
|
|
|
gst_object_unref (a52dec);
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2005-10-20 09:00:30 +00:00
|
|
|
static GstFlowReturn
|
|
|
|
gst_a52dec_chain (GstPad * pad, GstBuffer * buf)
|
2005-11-25 14:50:19 +00:00
|
|
|
{
|
2006-08-07 14:01:33 +00:00
|
|
|
GstA52Dec *a52dec = GST_A52DEC (GST_PAD_PARENT (pad));
|
2005-11-25 14:50:19 +00:00
|
|
|
GstFlowReturn ret;
|
2006-08-07 14:01:33 +00:00
|
|
|
gint first_access;
|
2005-11-25 14:50:19 +00:00
|
|
|
|
2008-05-26 09:06:54 +00:00
|
|
|
if (GST_BUFFER_IS_DISCONT (buf)) {
|
|
|
|
GST_LOG_OBJECT (a52dec, "received DISCONT");
|
2008-06-02 11:59:07 +00:00
|
|
|
gst_a52dec_drain (a52dec);
|
2008-05-26 09:06:54 +00:00
|
|
|
/* clear cache on discont and mark a discont in the element */
|
|
|
|
if (a52dec->cache) {
|
|
|
|
gst_buffer_unref (a52dec->cache);
|
|
|
|
a52dec->cache = NULL;
|
|
|
|
}
|
|
|
|
a52dec->discont = TRUE;
|
|
|
|
}
|
|
|
|
|
2005-11-25 14:50:19 +00:00
|
|
|
if (a52dec->dvdmode) {
|
|
|
|
gint size = GST_BUFFER_SIZE (buf);
|
|
|
|
guchar *data = GST_BUFFER_DATA (buf);
|
|
|
|
gint offset;
|
|
|
|
gint len;
|
|
|
|
GstBuffer *subbuf;
|
|
|
|
|
2006-08-07 14:01:33 +00:00
|
|
|
if (size < 2)
|
|
|
|
goto not_enough_data;
|
2005-11-25 14:50:19 +00:00
|
|
|
|
|
|
|
first_access = (data[0] << 8) | data[1];
|
|
|
|
|
|
|
|
/* Skip the first_access header */
|
|
|
|
offset = 2;
|
|
|
|
|
|
|
|
if (first_access > 1) {
|
|
|
|
/* Length of data before first_access */
|
|
|
|
len = first_access - 1;
|
|
|
|
|
2006-08-07 14:01:33 +00:00
|
|
|
if (len <= 0 || offset + len > size)
|
|
|
|
goto bad_first_access_parameter;
|
2005-11-25 14:50:19 +00:00
|
|
|
|
|
|
|
subbuf = gst_buffer_create_sub (buf, offset, len);
|
|
|
|
GST_BUFFER_TIMESTAMP (subbuf) = GST_CLOCK_TIME_NONE;
|
|
|
|
ret = gst_a52dec_chain_raw (pad, subbuf);
|
|
|
|
if (ret != GST_FLOW_OK)
|
|
|
|
goto done;
|
|
|
|
|
|
|
|
offset += len;
|
|
|
|
len = size - offset;
|
|
|
|
|
|
|
|
if (len > 0) {
|
|
|
|
subbuf = gst_buffer_create_sub (buf, offset, len);
|
|
|
|
GST_BUFFER_TIMESTAMP (subbuf) = GST_BUFFER_TIMESTAMP (buf);
|
|
|
|
|
|
|
|
ret = gst_a52dec_chain_raw (pad, subbuf);
|
|
|
|
}
|
|
|
|
} else {
|
2006-08-07 16:18:33 +00:00
|
|
|
/* first_access = 0 or 1, so if there's a timestamp it applies to the first byte */
|
2005-11-25 14:50:19 +00:00
|
|
|
subbuf = gst_buffer_create_sub (buf, offset, size - offset);
|
2006-08-07 16:18:33 +00:00
|
|
|
GST_BUFFER_TIMESTAMP (subbuf) = GST_BUFFER_TIMESTAMP (buf);
|
2005-11-25 14:50:19 +00:00
|
|
|
ret = gst_a52dec_chain_raw (pad, subbuf);
|
|
|
|
}
|
|
|
|
} else {
|
2009-10-13 12:05:32 +00:00
|
|
|
gst_buffer_ref (buf);
|
2005-11-25 14:50:19 +00:00
|
|
|
ret = gst_a52dec_chain_raw (pad, buf);
|
|
|
|
}
|
|
|
|
|
|
|
|
done:
|
2009-10-13 12:05:32 +00:00
|
|
|
gst_buffer_unref (buf);
|
2005-11-25 14:50:19 +00:00
|
|
|
return ret;
|
2006-08-07 14:01:33 +00:00
|
|
|
|
|
|
|
/* ERRORS */
|
|
|
|
not_enough_data:
|
|
|
|
{
|
|
|
|
GST_ELEMENT_ERROR (GST_ELEMENT (a52dec), STREAM, DECODE, (NULL),
|
|
|
|
("Insufficient data in buffer. Can't determine first_acess"));
|
2009-10-13 12:05:32 +00:00
|
|
|
gst_buffer_unref (buf);
|
2006-08-07 14:01:33 +00:00
|
|
|
return GST_FLOW_ERROR;
|
|
|
|
}
|
|
|
|
bad_first_access_parameter:
|
|
|
|
{
|
|
|
|
GST_ELEMENT_ERROR (GST_ELEMENT (a52dec), STREAM, DECODE, (NULL),
|
|
|
|
("Bad first_access parameter (%d) in buffer", first_access));
|
2009-10-13 12:05:32 +00:00
|
|
|
gst_buffer_unref (buf);
|
2006-08-07 14:01:33 +00:00
|
|
|
return GST_FLOW_ERROR;
|
|
|
|
}
|
2005-11-25 14:50:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static GstFlowReturn
|
|
|
|
gst_a52dec_chain_raw (GstPad * pad, GstBuffer * buf)
|
2004-12-06 10:28:13 +00:00
|
|
|
{
|
2009-05-18 23:51:49 +00:00
|
|
|
GstA52Dec *a52dec;
|
2004-12-06 10:28:13 +00:00
|
|
|
guint8 *data;
|
|
|
|
guint size;
|
|
|
|
gint length = 0, flags, sample_rate, bit_rate;
|
2005-10-20 09:00:30 +00:00
|
|
|
GstFlowReturn result = GST_FLOW_OK;
|
2004-04-01 11:48:27 +00:00
|
|
|
|
2009-05-18 23:51:49 +00:00
|
|
|
a52dec = GST_A52DEC (GST_PAD_PARENT (pad));
|
|
|
|
|
2006-03-15 22:01:40 +00:00
|
|
|
if (!a52dec->sent_segment) {
|
|
|
|
GstSegment segment;
|
|
|
|
|
|
|
|
/* Create a basic segment. Usually, we'll get a new-segment sent by
|
|
|
|
* another element that will know more information (a demuxer). If we're
|
|
|
|
* just looking at a raw AC3 stream, we won't - so we need to send one
|
|
|
|
* here, but we don't know much info, so just send a minimal TIME
|
|
|
|
* new-segment event
|
|
|
|
*/
|
|
|
|
gst_segment_init (&segment, GST_FORMAT_TIME);
|
|
|
|
gst_pad_push_event (a52dec->srcpad, gst_event_new_new_segment (FALSE,
|
|
|
|
segment.rate, segment.format, segment.start,
|
|
|
|
segment.duration, segment.start));
|
|
|
|
a52dec->sent_segment = TRUE;
|
|
|
|
}
|
|
|
|
|
2004-12-06 10:28:13 +00:00
|
|
|
/* merge with cache, if any. Also make sure timestamps match */
|
|
|
|
if (GST_BUFFER_TIMESTAMP_IS_VALID (buf)) {
|
|
|
|
a52dec->time = GST_BUFFER_TIMESTAMP (buf);
|
ext/a52dec/gsta52dec.c: Add some debug output. Check that a discont has a valid time associated.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_push),
(gst_a52dec_handle_event), (gst_a52dec_chain):
Add some debug output. Check that a discont has a valid
time associated.
* ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event),
(gst_alsa_sink_loop):
Ignore TAG events. A little extra debug for broken timestamps.
* ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_init), (dvdnavsrc_loop),
(dvdnavsrc_change_state):
Ensure we send a discont to engage the link before we send any
other events.
* ext/dvdread/dvdreadsrc.c: (dvdreadsrc_init),
(dvdreadsrc_finalize), (_close), (_open), (_seek_title),
(_seek_chapter), (seek_sector), (dvdreadsrc_get),
(dvdreadsrc_uri_get_uri), (dvdreadsrc_uri_set_uri):
Handle URI of the form dvd://title[,chapter[,angle]]. Currently only
dvd://title works in totem because typefinding sends a seek that ends
up going back to chapter 1 regardless.
* ext/mpeg2dec/gstmpeg2dec.c:
* ext/mpeg2dec/gstmpeg2dec.h:
Output correct timestamps and handle disconts.
* ext/ogg/gstoggdemux.c: (get_relative):
Small guard against a null dereference.
* ext/pango/gsttextoverlay.c: (gst_textoverlay_finalize),
(gst_textoverlay_set_property):
Free memory when done. Don't call gst_event_filler_get_duration on
EOS events. Use GST_LOG and GST_WARNING instead of g_message and
g_warning.
* ext/smoothwave/gstsmoothwave.c: (gst_smoothwave_init),
(draw_line), (gst_smoothwave_dispose), (gst_sw_sinklink),
(gst_sw_srclink), (gst_smoothwave_chain):
Draw solid lines, prettier colours.
* gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_init):
Add a default palette that'll work for some movies.
* gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_init),
(gst_dvd_demux_handle_dvd_event), (gst_dvd_demux_send_discont),
(gst_dvd_demux_send_subbuffer), (gst_dvd_demux_reset):
* gst/mpegstream/gstdvddemux.h:
* gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_discont),
(gst_mpeg_demux_parse_syshead), (gst_mpeg_demux_parse_pes):
* gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_init),
(gst_mpeg_parse_handle_discont), (gst_mpeg_parse_parse_packhead):
* gst/mpegstream/gstmpegparse.h:
Use PTM/NAV events when for timestamp adjustment when connected to
dvdnavsrc. Don't use many discont events where one suffices.
* gst/playback/gstplaybasebin.c: (group_destroy),
(gen_preroll_element), (gst_play_base_bin_add_element):
* gst/playback/gstplaybasebin.h:
Make sure we remove subtitles from the same bin we put them in.
* gst/subparse/gstsubparse.c: (convert_encoding), (parse_subrip),
(gst_subparse_buffer_format_autodetect),
(gst_subparse_change_state):
Fix some memleaks and invalid accesses.
* gst/typefind/gsttypefindfunctions.c: (ogganx_type_find),
(oggskel_type_find), (cmml_type_find), (plugin_init):
Some typefind functions for Annodex v3.0 files
* gst/wavparse/gstwavparse.h:
GstRiffReadClass is the correct parent class.
2005-01-25 15:34:08 +00:00
|
|
|
GST_DEBUG_OBJECT (a52dec,
|
|
|
|
"Received buffer with ts %" GST_TIME_FORMAT " duration %"
|
|
|
|
GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)),
|
|
|
|
GST_TIME_ARGS (GST_BUFFER_DURATION (buf)));
|
2004-12-06 10:28:13 +00:00
|
|
|
}
|
ext/a52dec/gsta52dec.c: Add some debug output. Check that a discont has a valid time associated.
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_push),
(gst_a52dec_handle_event), (gst_a52dec_chain):
Add some debug output. Check that a discont has a valid
time associated.
* ext/alsa/gstalsasink.c: (gst_alsa_sink_check_event),
(gst_alsa_sink_loop):
Ignore TAG events. A little extra debug for broken timestamps.
* ext/dvdnav/dvdnavsrc.c: (dvdnavsrc_init), (dvdnavsrc_loop),
(dvdnavsrc_change_state):
Ensure we send a discont to engage the link before we send any
other events.
* ext/dvdread/dvdreadsrc.c: (dvdreadsrc_init),
(dvdreadsrc_finalize), (_close), (_open), (_seek_title),
(_seek_chapter), (seek_sector), (dvdreadsrc_get),
(dvdreadsrc_uri_get_uri), (dvdreadsrc_uri_set_uri):
Handle URI of the form dvd://title[,chapter[,angle]]. Currently only
dvd://title works in totem because typefinding sends a seek that ends
up going back to chapter 1 regardless.
* ext/mpeg2dec/gstmpeg2dec.c:
* ext/mpeg2dec/gstmpeg2dec.h:
Output correct timestamps and handle disconts.
* ext/ogg/gstoggdemux.c: (get_relative):
Small guard against a null dereference.
* ext/pango/gsttextoverlay.c: (gst_textoverlay_finalize),
(gst_textoverlay_set_property):
Free memory when done. Don't call gst_event_filler_get_duration on
EOS events. Use GST_LOG and GST_WARNING instead of g_message and
g_warning.
* ext/smoothwave/gstsmoothwave.c: (gst_smoothwave_init),
(draw_line), (gst_smoothwave_dispose), (gst_sw_sinklink),
(gst_sw_srclink), (gst_smoothwave_chain):
Draw solid lines, prettier colours.
* gst/mpeg2sub/gstmpeg2subt.c: (gst_mpeg2subt_init):
Add a default palette that'll work for some movies.
* gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_init),
(gst_dvd_demux_handle_dvd_event), (gst_dvd_demux_send_discont),
(gst_dvd_demux_send_subbuffer), (gst_dvd_demux_reset):
* gst/mpegstream/gstdvddemux.h:
* gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_send_discont),
(gst_mpeg_demux_parse_syshead), (gst_mpeg_demux_parse_pes):
* gst/mpegstream/gstmpegparse.c: (gst_mpeg_parse_init),
(gst_mpeg_parse_handle_discont), (gst_mpeg_parse_parse_packhead):
* gst/mpegstream/gstmpegparse.h:
Use PTM/NAV events when for timestamp adjustment when connected to
dvdnavsrc. Don't use many discont events where one suffices.
* gst/playback/gstplaybasebin.c: (group_destroy),
(gen_preroll_element), (gst_play_base_bin_add_element):
* gst/playback/gstplaybasebin.h:
Make sure we remove subtitles from the same bin we put them in.
* gst/subparse/gstsubparse.c: (convert_encoding), (parse_subrip),
(gst_subparse_buffer_format_autodetect),
(gst_subparse_change_state):
Fix some memleaks and invalid accesses.
* gst/typefind/gsttypefindfunctions.c: (ogganx_type_find),
(oggskel_type_find), (cmml_type_find), (plugin_init):
Some typefind functions for Annodex v3.0 files
* gst/wavparse/gstwavparse.h:
GstRiffReadClass is the correct parent class.
2005-01-25 15:34:08 +00:00
|
|
|
|
2004-12-06 10:28:13 +00:00
|
|
|
if (a52dec->cache) {
|
|
|
|
buf = gst_buffer_join (a52dec->cache, buf);
|
|
|
|
a52dec->cache = NULL;
|
|
|
|
}
|
|
|
|
data = GST_BUFFER_DATA (buf);
|
|
|
|
size = GST_BUFFER_SIZE (buf);
|
2001-12-26 21:51:41 +00:00
|
|
|
|
2004-12-06 10:28:13 +00:00
|
|
|
/* find and read header */
|
|
|
|
bit_rate = a52dec->bit_rate;
|
|
|
|
sample_rate = a52dec->sample_rate;
|
|
|
|
flags = 0;
|
|
|
|
while (size >= 7) {
|
|
|
|
length = a52_syncinfo (data, &flags, &sample_rate, &bit_rate);
|
2008-09-27 00:20:48 +00:00
|
|
|
|
2004-12-06 10:28:13 +00:00
|
|
|
if (length == 0) {
|
|
|
|
/* no sync */
|
|
|
|
data++;
|
|
|
|
size--;
|
|
|
|
} else if (length <= size) {
|
|
|
|
GST_DEBUG ("Sync: %d", length);
|
2009-05-18 23:51:49 +00:00
|
|
|
|
|
|
|
if (flags != a52dec->prev_flags)
|
|
|
|
a52dec->flag_update = TRUE;
|
|
|
|
a52dec->prev_flags = flags;
|
|
|
|
|
2005-10-20 09:00:30 +00:00
|
|
|
result = gst_a52dec_handle_frame (a52dec, data,
|
|
|
|
length, flags, sample_rate, bit_rate);
|
|
|
|
if (result != GST_FLOW_OK) {
|
2004-12-06 10:28:13 +00:00
|
|
|
size = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
size -= length;
|
|
|
|
data += length;
|
|
|
|
} else {
|
|
|
|
/* not enough data */
|
|
|
|
GST_LOG ("Not enough data available");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* keep cache */
|
|
|
|
if (length == 0) {
|
|
|
|
GST_LOG ("No sync found");
|
|
|
|
}
|
2005-10-20 09:00:30 +00:00
|
|
|
|
2004-12-06 10:28:13 +00:00
|
|
|
if (size > 0) {
|
|
|
|
a52dec->cache = gst_buffer_create_sub (buf,
|
|
|
|
GST_BUFFER_SIZE (buf) - size, size);
|
|
|
|
}
|
2005-10-20 09:00:30 +00:00
|
|
|
|
2001-12-26 21:51:41 +00:00
|
|
|
gst_buffer_unref (buf);
|
2005-10-20 09:00:30 +00:00
|
|
|
|
|
|
|
return result;
|
2001-12-26 21:51:41 +00:00
|
|
|
}
|
|
|
|
|
2005-09-02 15:43:54 +00:00
|
|
|
static GstStateChangeReturn
|
|
|
|
gst_a52dec_change_state (GstElement * element, GstStateChange transition)
|
2001-12-26 21:51:41 +00:00
|
|
|
{
|
2005-10-20 09:00:30 +00:00
|
|
|
GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
|
2005-10-20 09:51:58 +00:00
|
|
|
GstA52Dec *a52dec = GST_A52DEC (element);
|
2001-12-26 21:51:41 +00:00
|
|
|
|
2005-09-02 15:43:54 +00:00
|
|
|
switch (transition) {
|
2005-10-20 09:51:58 +00:00
|
|
|
case GST_STATE_CHANGE_NULL_TO_READY:{
|
|
|
|
GstA52DecClass *klass;
|
|
|
|
|
|
|
|
klass = GST_A52DEC_CLASS (G_OBJECT_GET_CLASS (a52dec));
|
|
|
|
a52dec->state = a52_init (klass->a52_cpuflags);
|
2001-12-26 21:51:41 +00:00
|
|
|
break;
|
2005-10-20 09:51:58 +00:00
|
|
|
}
|
2005-09-02 15:43:54 +00:00
|
|
|
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
2002-03-21 23:45:58 +00:00
|
|
|
a52dec->samples = a52_samples (a52dec->state);
|
2001-12-26 21:51:41 +00:00
|
|
|
a52dec->bit_rate = -1;
|
|
|
|
a52dec->sample_rate = -1;
|
2002-09-21 12:07:43 +00:00
|
|
|
a52dec->stream_channels = A52_CHANNEL;
|
|
|
|
a52dec->using_channels = A52_CHANNEL;
|
2001-12-26 21:51:41 +00:00
|
|
|
a52dec->level = 1;
|
2004-11-27 20:22:42 +00:00
|
|
|
a52dec->bias = 0;
|
2004-12-06 10:28:13 +00:00
|
|
|
a52dec->time = 0;
|
2006-03-15 22:01:40 +00:00
|
|
|
a52dec->sent_segment = FALSE;
|
2008-09-27 00:20:48 +00:00
|
|
|
a52dec->flag_update = TRUE;
|
2008-05-26 09:06:54 +00:00
|
|
|
gst_segment_init (&a52dec->segment, GST_FORMAT_UNDEFINED);
|
2001-12-26 21:51:41 +00:00
|
|
|
break;
|
2005-09-02 15:43:54 +00:00
|
|
|
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
|
2001-12-26 21:51:41 +00:00
|
|
|
break;
|
2005-10-20 09:00:30 +00:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
|
|
|
|
|
|
|
|
switch (transition) {
|
2005-09-02 15:43:54 +00:00
|
|
|
case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
|
2001-12-26 21:51:41 +00:00
|
|
|
break;
|
2005-09-02 15:43:54 +00:00
|
|
|
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
2002-03-21 23:45:58 +00:00
|
|
|
a52dec->samples = NULL;
|
2004-12-06 10:28:13 +00:00
|
|
|
if (a52dec->cache) {
|
|
|
|
gst_buffer_unref (a52dec->cache);
|
|
|
|
a52dec->cache = NULL;
|
|
|
|
}
|
2008-06-02 11:59:07 +00:00
|
|
|
clear_queued (a52dec);
|
2001-12-26 21:51:41 +00:00
|
|
|
break;
|
2005-09-02 15:43:54 +00:00
|
|
|
case GST_STATE_CHANGE_READY_TO_NULL:
|
2004-04-01 11:48:27 +00:00
|
|
|
a52_free (a52dec->state);
|
|
|
|
a52dec->state = NULL;
|
2001-12-26 21:51:41 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2005-10-20 09:00:30 +00:00
|
|
|
return ret;
|
2001-12-26 21:51:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_a52dec_set_property (GObject * object, guint prop_id, const GValue * value,
|
|
|
|
GParamSpec * pspec)
|
2001-12-26 21:51:41 +00:00
|
|
|
{
|
2005-10-20 09:00:30 +00:00
|
|
|
GstA52Dec *src = GST_A52DEC (object);
|
2001-12-26 21:51:41 +00:00
|
|
|
|
|
|
|
switch (prop_id) {
|
|
|
|
case ARG_DRC:
|
2005-11-21 16:36:44 +00:00
|
|
|
GST_OBJECT_LOCK (src);
|
2001-12-26 21:51:41 +00:00
|
|
|
src->dynamic_range_compression = g_value_get_boolean (value);
|
2005-11-21 16:36:44 +00:00
|
|
|
GST_OBJECT_UNLOCK (src);
|
2001-12-26 21:51:41 +00:00
|
|
|
break;
|
ext/a52dec/gsta52dec.*: Add two things to a52dec: configure the exact output format for ac3 decoding through properti...
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_mode_get_type),
(gst_a52dec_class_init), (gst_a52dec_init), (gst_a52dec_channels),
(gst_a52dec_handle_frame), (gst_a52dec_change_state),
(gst_a52dec_set_property), (gst_a52dec_get_property):
* ext/a52dec/gsta52dec.h:
Patch from from Michal Benes <michal.benes@itonis.tv>:
Add two things to a52dec: configure the exact output format for ac3
decoding through properties, if desired.
By default, configure an output format preferred by downstream. Now
that audioconvert lists caps by preference, this means that a52dec
can do downmixing (iff required) rather than audioconvert, so it can
use the ac3 downmix levels from the bitstream.
2006-09-01 16:21:43 +00:00
|
|
|
case ARG_MODE:
|
|
|
|
GST_OBJECT_LOCK (src);
|
|
|
|
src->request_channels &= ~A52_CHANNEL_MASK;
|
|
|
|
src->request_channels |= g_value_get_enum (value);
|
|
|
|
GST_OBJECT_UNLOCK (src);
|
|
|
|
break;
|
|
|
|
case ARG_LFE:
|
|
|
|
GST_OBJECT_LOCK (src);
|
|
|
|
src->request_channels &= ~A52_LFE;
|
|
|
|
src->request_channels |= g_value_get_boolean (value) ? A52_LFE : 0;
|
|
|
|
GST_OBJECT_UNLOCK (src);
|
|
|
|
break;
|
2001-12-26 21:51:41 +00:00
|
|
|
default:
|
|
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2004-03-14 22:34:30 +00:00
|
|
|
gst_a52dec_get_property (GObject * object, guint prop_id, GValue * value,
|
|
|
|
GParamSpec * pspec)
|
2001-12-26 21:51:41 +00:00
|
|
|
{
|
2005-10-20 09:00:30 +00:00
|
|
|
GstA52Dec *src = GST_A52DEC (object);
|
2001-12-26 21:51:41 +00:00
|
|
|
|
|
|
|
switch (prop_id) {
|
|
|
|
case ARG_DRC:
|
2005-11-21 16:36:44 +00:00
|
|
|
GST_OBJECT_LOCK (src);
|
2002-03-21 23:45:58 +00:00
|
|
|
g_value_set_boolean (value, src->dynamic_range_compression);
|
2005-11-21 16:36:44 +00:00
|
|
|
GST_OBJECT_UNLOCK (src);
|
2001-12-26 21:51:41 +00:00
|
|
|
break;
|
ext/a52dec/gsta52dec.*: Add two things to a52dec: configure the exact output format for ac3 decoding through properti...
Original commit message from CVS:
* ext/a52dec/gsta52dec.c: (gst_a52dec_mode_get_type),
(gst_a52dec_class_init), (gst_a52dec_init), (gst_a52dec_channels),
(gst_a52dec_handle_frame), (gst_a52dec_change_state),
(gst_a52dec_set_property), (gst_a52dec_get_property):
* ext/a52dec/gsta52dec.h:
Patch from from Michal Benes <michal.benes@itonis.tv>:
Add two things to a52dec: configure the exact output format for ac3
decoding through properties, if desired.
By default, configure an output format preferred by downstream. Now
that audioconvert lists caps by preference, this means that a52dec
can do downmixing (iff required) rather than audioconvert, so it can
use the ac3 downmix levels from the bitstream.
2006-09-01 16:21:43 +00:00
|
|
|
case ARG_MODE:
|
|
|
|
GST_OBJECT_LOCK (src);
|
|
|
|
g_value_set_enum (value, src->request_channels & A52_CHANNEL_MASK);
|
|
|
|
GST_OBJECT_UNLOCK (src);
|
|
|
|
break;
|
|
|
|
case ARG_LFE:
|
|
|
|
GST_OBJECT_LOCK (src);
|
|
|
|
g_value_set_boolean (value, src->request_channels & A52_LFE);
|
|
|
|
GST_OBJECT_UNLOCK (src);
|
|
|
|
break;
|
2001-12-26 21:51:41 +00:00
|
|
|
default:
|
|
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
2003-11-01 01:32:03 +00:00
|
|
|
plugin_init (GstPlugin * plugin)
|
2001-12-26 21:51:41 +00:00
|
|
|
{
|
2010-06-14 13:33:14 +00:00
|
|
|
#if HAVE_ORC
|
|
|
|
orc_init ();
|
|
|
|
#endif
|
|
|
|
|
2006-06-23 16:29:41 +00:00
|
|
|
/* ensure GstAudioChannelPosition type is registered */
|
|
|
|
if (!gst_audio_channel_position_get_type ())
|
|
|
|
return FALSE;
|
|
|
|
|
2006-06-23 09:28:28 +00:00
|
|
|
if (!gst_element_register (plugin, "a52dec", GST_RANK_SECONDARY,
|
2004-03-15 19:32:25 +00:00
|
|
|
GST_TYPE_A52DEC))
|
2003-11-01 01:32:03 +00:00
|
|
|
return FALSE;
|
2001-12-26 21:51:41 +00:00
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2004-03-14 22:34:30 +00:00
|
|
|
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
|
|
|
|
GST_VERSION_MINOR,
|
|
|
|
"a52dec",
|
|
|
|
"Decodes ATSC A/52 encoded audio streams",
|
2006-04-01 09:54:39 +00:00
|
|
|
plugin_init, VERSION, "GPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN);
|