summaryrefslogtreecommitdiffstats
path: root/debian/transcode/transcode-1.1.7/import/probe_ffmpeg.c
diff options
context:
space:
mode:
Diffstat (limited to 'debian/transcode/transcode-1.1.7/import/probe_ffmpeg.c')
-rw-r--r--debian/transcode/transcode-1.1.7/import/probe_ffmpeg.c149
1 files changed, 149 insertions, 0 deletions
diff --git a/debian/transcode/transcode-1.1.7/import/probe_ffmpeg.c b/debian/transcode/transcode-1.1.7/import/probe_ffmpeg.c
new file mode 100644
index 00000000..96d3d491
--- /dev/null
+++ b/debian/transcode/transcode-1.1.7/import/probe_ffmpeg.c
@@ -0,0 +1,149 @@
+/*
+ * probe_ffmpeg.c -- libavcodec/libavformat based probing code
+ * (C) 2006-2010 Francesco Romani <fromani -at- gmail -dot- com>
+ *
+ * This file is part of transcode, a video stream processing tool.
+ *
+ * transcode is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * transcode 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "transcode.h"
+#include "tcinfo.h"
+#include "ioaux.h"
+#include "tc.h"
+#include "libtc/libtc.h"
+#include "libtc/ratiocodes.h"
+
+#ifdef HAVE_FFMPEG
+
+#include "libtc/tcavcodec.h"
+
+
+static void translate_info(const AVFormatContext *ctx, ProbeInfo *info)
+{
+ AVStream *st = NULL;
+ int i = 0, j = 0;
+
+ if (ctx == NULL || info == NULL) {
+ return;
+ }
+
+ /* first of all, video */
+ for (i = 0; i < ctx->nb_streams; i++) {
+ st = ctx->streams[i];
+
+ if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
+ info->bitrate = st->codec->bit_rate / 1000;
+ info->width = st->codec->width;
+ info->height = st->codec->height;
+ if (st->r_frame_rate.num > 0 && st->r_frame_rate.den > 0) {
+ info->fps = av_q2d(st->r_frame_rate);
+ } else {
+ /* watch out here */
+ info->fps = 1.0/av_q2d(st->codec->time_base);
+ }
+ tc_frc_code_from_value(&info->frc, info->fps);
+ break;
+ }
+ }
+ /* then audio track(s) */
+ for (i = 0; i < ctx->nb_streams; i++) {
+ st = ctx->streams[i];
+
+ if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO
+ && j < TC_MAX_AUD_TRACKS) {
+ info->track[j].format = 0x1; /* known wrong */
+ info->track[j].chan = st->codec->channels;
+ info->track[j].samplerate = st->codec->sample_rate;
+ info->track[j].bitrate = st->codec->bit_rate / 1000;
+ /* XXX: known wrong for PCM */
+
+ info->track[j].bits = BITS;
+ /*
+ * XXX where libavcodec/libaformat provide this?
+ * Should be inferred by CODEC_ID used?
+ * */
+ info->track[j].pts_start = 0; /* XXX: ?!? */
+
+ j++;
+ }
+ }
+
+ info->num_tracks = j;
+}
+
+
+
+void probe_ffmpeg(info_t *ipipe)
+{
+ /* to be completed */
+ AVFormatContext *lavf_dmx_context = NULL;
+ int ret = 0;
+
+ close(ipipe->fd_in);
+
+ TC_INIT_LIBAVCODEC;
+
+ ret = av_open_input_file(&lavf_dmx_context, ipipe->name,
+ NULL, 0, NULL);
+ if (ret != 0) {
+ tc_log_error(__FILE__, "unable to open '%s'"
+ " (libavformat failure)",
+ ipipe->name);
+ ipipe->error = 1;
+ return;
+ }
+
+ ret = av_find_stream_info(lavf_dmx_context);
+ if (ret < 0) {
+ tc_log_error(__FILE__, "unable to fetch informations from '%s'"
+ " (libavformat failure)",
+ ipipe->name);
+ ipipe->error = 1;
+ return;
+ }
+
+ translate_info(lavf_dmx_context, ipipe->probe_info);
+
+ av_close_input_file(lavf_dmx_context);
+ return;
+}
+
+#else // HAVE_FFMPEG
+
+void probe_ffmpeg(info_t *ipipe)
+{
+ tc_log_error(__FILE__, "no support for FFmpeg compiled - exit.");
+ ipipe->error = 1;
+ return;
+}
+
+#endif // HAVE_FFMPEG
+
+
+/*************************************************************************/
+
+/*
+ * Local variables:
+ * c-file-style: "stroustrup"
+ * c-file-offsets: ((case-label . *) (statement-case-intro . *))
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vim: expandtab shiftwidth=4:
+ */