• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * GStreamer DirectShow codecs wrapper
3  * Copyright <2006, 2007, 2008, 2009, 2010> Fluendo <support@fluendo.com>
4  * Copyright <2006, 2007, 2008> Pioneers of the Inevitable <songbird@songbirdnest.com>
5  * Copyright <2007,2008> Sebastien Moutte <sebastien@moutte.net>
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a
8  * copy of this software and associated documentation files (the "Software"),
9  * to deal in the Software without restriction, including without limitation
10  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11  * and/or sell copies of the Software, and to permit persons to whom the
12  * Software is furnished to do so, subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be included in
15  * all copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23  * DEALINGS IN THE SOFTWARE.
24  *
25  * Alternatively, the contents of this file may be used under the
26  * GNU Lesser General Public License Version 2.1 (the "LGPL"), in
27  * which case the following provisions apply instead of the ones
28  * mentioned above:
29  *
30  * This library is free software; you can redistribute it and/or
31  * modify it under the terms of the GNU Library General Public
32  * License as published by the Free Software Foundation; either
33  * version 2 of the License, or (at your option) any later version.
34  *
35  * This library is distributed in the hope that it will be useful,
36  * but WITHOUT ANY WARRANTY; without even the implied warranty of
37  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
38  * Library General Public License for more details.
39  *
40  * You should have received a copy of the GNU Library General Public
41  * License along with this library; if not, write to the
42  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
43  * Boston, MA 02110-1301, USA.
44  */
45 
46 
47 #ifndef __GST_DSHOWAUDIODEC_H__
48 #define __GST_DSHOWAUDIODEC_H__
49 
50 #include <gst/gst.h>
51 #include "gstdshowutil.h"
52 #include "gstdshowfakesrc.h"
53 
54 G_BEGIN_DECLS
55 
56 typedef struct {
57   gchar *element_name;      /* The gst element factory name */
58   gchar *element_longname;  /* Description string for element */
59   gint32 format;            /* WAVEFORMATEX format */
60   gchar *sinkcaps;          /* GStreamer caps of input format */
61   PreferredFilter *preferred_filters; /* NULL-terminated list of preferred filters */
62 } AudioCodecEntry;
63 
64 #define GST_TYPE_DSHOWAUDIODEC               (gst_dshowaudiodec_get_type())
65 #define GST_DSHOWAUDIODEC(obj)              (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DSHOWAUDIODEC,GstDshowAudioDec))
66 #define GST_DSHOWAUDIODEC_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DSHOWAUDIODEC,GstDshowAudioDecClass))
67 #define GST_IS_DSHOWAUDIODEC(obj)           (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DSHOWAUDIODEC))
68 #define GST_IS_DSHOWAUDIODEC_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DSHOWAUDIODEC))
69 
70 typedef struct _GstDshowAudioDec GstDshowAudioDec;
71 typedef struct _GstDshowAudioDecClass GstDshowAudioDecClass;
72 
73 class AudioFakeSink;
74 
75 struct _GstDshowAudioDec
76 {
77   GstElement element;
78 
79   /* element pads */
80   GstPad *sinkpad;
81   GstPad *srcpad;
82 
83   GstFlowReturn last_ret;
84 
85   /* filters interfaces*/
86   FakeSrc *fakesrc;
87   AudioFakeSink *fakesink;
88 
89   IBaseFilterPtr decfilter;
90 
91   /* graph manager interfaces */
92   IMediaFilterPtr mediafilter;
93   IFilterGraphPtr filtergraph;
94 
95   /* true when dshow graph is setup */
96   gboolean setup;
97 
98   /* audio settings */
99   gint bitrate;
100   gint block_align;
101   gint depth;
102   gint channels;
103   gint rate;
104   gint layer;
105   GstBuffer *codec_data;
106 
107   /* current segment */
108   GstSegment * segment;
109 
110   /* timestamp of the next buffer */
111   GstClockTime timestamp;
112 
113   gboolean comInitialized;
114   GMutex   com_init_lock;
115   GMutex   com_deinit_lock;
116   GCond    com_initialized;
117   GCond    com_uninitialize;
118   GCond    com_uninitialized;
119 };
120 
121 struct _GstDshowAudioDecClass
122 {
123   GstElementClass parent_class;
124   const AudioCodecEntry *entry;
125 };
126 
127 gboolean dshow_adec_register (GstPlugin * plugin);
128 
129 const GUID CLSID_AudioFakeSink =
130 { 0x3867f537, 0x3e3d, 0x44da,
131   { 0xbb, 0xf2, 0x02, 0x48, 0x7b, 0xb0, 0xbc, 0xc4} };
132 
133 class AudioFakeSink :  public CBaseRenderer
134 {
135 public:
AudioFakeSink(GstDshowAudioDec * dec)136   AudioFakeSink(GstDshowAudioDec *dec) :
137       m_hres(S_OK),
138       CBaseRenderer(CLSID_AudioFakeSink, _T("AudioFakeSink"), NULL, &m_hres),
139       mDec(dec)
140   {};
~AudioFakeSink()141   virtual ~AudioFakeSink() {};
142 
143   HRESULT DoRenderSample(IMediaSample *pMediaSample);
144   HRESULT CheckMediaType(const CMediaType *pmt);
SetMediaType(AM_MEDIA_TYPE * pmt)145   HRESULT SetMediaType (AM_MEDIA_TYPE *pmt)
146   {
147     m_MediaType.Set (*pmt);
148     return S_OK;
149   }
150   int GetBufferSize();
151 
152 protected:
153   HRESULT m_hres;
154   CMediaType m_MediaType;
155   GstDshowAudioDec *mDec;
156 };
157 
158 G_END_DECLS
159 
160 #endif /* __GST_DSHOWAUDIODEC_H__ */
161