/* * probe_ffmpeg.c -- libavcodec/libavformat based probing code * (C) 2006-2010 Francesco Romani * * 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 . */ #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: */