2 Copyright (C) 2006 Sebastian Freundt
4 This file is part of SXEmacs
6 SXEmacs is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 SXEmacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 /* Synched up with: Not in FSF. */
30 #include "media-ffmpeg.h"
33 #include "media-sndfile.h"
35 #ifdef HAVE_INTERNAL_MEDIA
36 #include "media-internal.h"
39 #include "media-mad.h"
42 #include "media-gstreamer.h"
45 #include "media-sox.h"
48 #include "media-xine.h"
51 Lisp_Object Qmedia_streamp;
53 Lisp_Object Qunavailable;
54 /* media property syms */
55 Lisp_Object Qdemux, Qcodec, Qnchannels, Qsamplerate;
56 Lisp_Object Qbitrate, Qabitrate, Qvbitrate;
57 Lisp_Object Qwidth, Qheight, Qaspect, Qdriver, Qkind, Qfifo, Quri, Qtype;
58 Lisp_Object Qaudio, Qvideo, Qimage;
60 static void determine_stream_type(Lisp_Media_Stream *ms, media_driver);
61 static void media_stream_print(Lisp_Object, Lisp_Object, int);
62 static void media_substream_print(media_substream *, Lisp_Object, int);
63 static void media_substream_finalise(void*, int);
66 static void determine_stream_type(Lisp_Media_Stream *ms, media_driver preferred)
69 if ((media_stream_driver(ms) == MDRIVER_UNKNOWN) &&
70 (preferred == MDRIVER_UNKNOWN ||
71 preferred == MDRIVER_FFMPEG)) {
72 MEDIA_DEBUG("trying ffmpeg.\n");
73 media_stream_set_meths(ms, media_ffmpeg);
74 media_stream_meth(ms, open)(ms);
78 if ((media_stream_driver(ms) == MDRIVER_UNKNOWN) &&
79 (preferred == MDRIVER_UNKNOWN ||
80 preferred == MDRIVER_MAD)) {
81 MEDIA_DEBUG("trying mad.\n");
82 media_stream_set_meths(ms, media_mad);
83 media_stream_meth(ms, open)(ms);
87 if ((media_stream_driver(ms) == MDRIVER_UNKNOWN) &&
88 (preferred == MDRIVER_UNKNOWN ||
89 preferred == MDRIVER_SOX)) {
90 MEDIA_DEBUG("trying sox.\n");
91 media_stream_set_meths(ms, media_sox);
92 media_stream_meth(ms, open)(ms);
96 if ((media_stream_driver(ms) == MDRIVER_UNKNOWN) &&
97 (preferred == MDRIVER_UNKNOWN ||
98 preferred == MDRIVER_SNDFILE)) {
99 MEDIA_DEBUG("trying sndfile.\n");
100 media_stream_set_meths(ms, media_sndfile);
101 media_stream_meth(ms, open)(ms);
104 /* not working stuff here :) */
106 #ifdef HAVE_GSTREAMER
107 if ((media_stream_driver(ms) == MDRIVER_UNKNOWN) &&
108 (preferred == MDRIVER_UNKNOWN ||
109 preferred == MDRIVER_GSTREAMER)) {
110 MEDIA_DEBUG("trying gstreamer.\n");
111 media_gstreamer_analyse_stream(ms);
116 if ((media_stream_driver(ms) == MDRIVER_UNKNOWN) &&
117 (preferred == MDRIVER_UNKNOWN ||
118 preferred == MDRIVER_XINE)) {
119 MEDIA_DEBUG("trying xine.\n");
120 media_stream_set_meths(ms, media_xine);
121 media_stream_meth(ms, open)(ms);
124 #ifdef HAVE_INTERNAL_MEDIA
125 if ((media_stream_driver(ms) == MDRIVER_UNKNOWN) &&
126 (preferred == MDRIVER_UNKNOWN ||
127 preferred == MDRIVER_INTERNAL)) {
128 MEDIA_DEBUG("trying internal.\n");
129 media_internal_analyse_stream(ms);
132 if (media_stream_driver(ms) == MDRIVER_UNKNOWN) {
133 MEDIA_DEBUG("giving up\n");
134 media_stream_set_meths(ms, NULL);
140 /*****************************************************************/
142 /*****************************************************************/
143 static Lisp_Object media_stream_mark(Lisp_Object obj)
145 switch (XMEDIA_STREAM_KIND(obj)) {
147 mark_object(XMEDIA_STREAM(obj)->
148 kind_properties.fprops->filename);
154 case NUMBER_OF_MEDIA_KINDS:
159 if (XMEDIA_STREAM_METHS(obj) &&
160 XMEDIA_STREAM_METH(obj, mark))
161 XMEDIA_STREAM_METH(obj, mark)(XMEDIA_STREAM_DATA(obj));
167 media_stream_finalise(void *header, int for_disksave)
169 Lisp_Media_Stream *ms = (Lisp_Media_Stream*)header;
170 media_substream *mss = NULL;
174 if (media_stream_meths(ms) &&
175 media_stream_meth(ms, close))
176 media_stream_meth(ms, close)(media_stream_data(ms));
178 mss = media_stream_first(ms);
180 media_substream_finalise(mss, for_disksave);
181 mss = media_substream_next(mss);
185 switch (media_stream_driver(ms)) {
188 if (media_stream_data(ms))
189 media_xine_close_context(media_stream_data(ms));
192 case MDRIVER_SNDFILE:
194 if (media_stream_data(ms))
195 sf_close(media_stream_data(ms));
200 if (media_stream_data(ms))
201 mad_decoder_finish(media_stream_data(ms));
206 if (media_stream_data(ms))
207 st_close(media_stream_data(ms));
215 switch (media_stream_kind(ms)) {
217 mkind_file_properties *mkfp;
218 mkfp = media_stream_kind_properties(ms).fprops;
225 mkind_string_properties *mksp;
226 mksp = media_stream_kind_properties(ms).sprops;
231 if (mksp->stream_data)
232 xfree(mksp->stream_data);