You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

232 lines
5.3 KiB

/*
* probe_stream.c
*
* Copyright (C) Thomas Oestreich - June 2001
*
* 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, 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 GNU Make; see the file COPYING. If not, write to
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#include "transcode.h"
#include "tcinfo.h"
#include "ioaux.h"
#include "probe_stream.h"
#include "libtc/libtc.h"
#include "libtc/ratiocodes.h"
static ProbeInfo probe_info;
static void guess_asr(ProbeInfo *info)
{
if (info != NULL && info->width != 0 && info->height != 0) {
double r = (double)info->width/(double)info->height;
tc_asr_code_from_value(&(info->asr), r);
}
}
void probe_file(info_t *ipipe)
{
switch (ipipe->magic) {
case TC_MAGIC_AVI:
probe_avi(ipipe);
break;
case TC_MAGIC_TIFF1: /* image formats (multiple fallbacks) */
case TC_MAGIC_TIFF2:
case TC_MAGIC_JPEG:
case TC_MAGIC_BMP:
case TC_MAGIC_PNG:
case TC_MAGIC_GIF:
case TC_MAGIC_PPM:
case TC_MAGIC_PGM:
case TC_MAGIC_SGI:
probe_im(ipipe); /* ImageMagick serve all */
break;
case TC_MAGIC_MXF:
probe_mxf(ipipe);
break;
case TC_MAGIC_OGG:
probe_ogg(ipipe);
break;
case TC_MAGIC_CDXA:
probe_pes(ipipe);
break;
case TC_MAGIC_MPEG_PS: /* MPEG Program Stream */
case TC_MAGIC_VOB: /* backward compatibility fallback */
probe_pes(ipipe);
break;
case TC_MAGIC_MPEG_ES: /* MPEG Elementary Stream */
case TC_MAGIC_M2V: /* backward compatibility fallback */
probe_pes(ipipe);
break;
case TC_MAGIC_MPEG_PES:/* MPEG Packetized Elementary Stream */
case TC_MAGIC_MPEG: /* backward compatibility fallback */
probe_pes(ipipe);
break;
case TC_MAGIC_YUV4MPEG:
probe_yuv(ipipe);
break;
case TC_MAGIC_NUV:
probe_nuv(ipipe);
break;
case TC_MAGIC_MOV:
probe_mov(ipipe);
break;
case TC_MAGIC_WAV:
probe_wav(ipipe);
break;
case TC_MAGIC_DTS:
probe_dts(ipipe);
break;
case TC_MAGIC_AC3:
probe_ac3(ipipe);
break;
case TC_MAGIC_MP3:
case TC_MAGIC_MP3_2:
case TC_MAGIC_MP3_2_5:
case TC_MAGIC_MP2:
probe_mp3(ipipe);
break;
case TC_MAGIC_DV_PAL:
case TC_MAGIC_DV_NTSC:
probe_dv(ipipe);
break;
case TC_MAGIC_PV3:
probe_pv3(ipipe);
break;
case TC_MAGIC_PVN:
probe_pvn(ipipe);
break;
default:
/* libavcodec/libavformat it's a catchall too */
probe_ffmpeg(ipipe);
}
return;
}
void probe_stream(info_t *ipipe)
{
verbose = ipipe->verbose;
ipipe->probe_info = &probe_info;
ipipe->probe = 1;
/* data structure will be filled by subroutines */
memset(&probe_info, 0, sizeof(ProbeInfo));
probe_info.magic = ipipe->magic;
/* ------------------------------------------------------------
* check file type/magic and take action to probe for contents
* ------------------------------------------------------------*/
/* not-plain-old-file stuff */
switch (ipipe->magic) {
case TC_MAGIC_MPLAYER:
probe_mplayer(ipipe);
break;
case TC_MAGIC_VNC:
probe_vnc(ipipe);
break;
case TC_MAGIC_V4L_VIDEO:
case TC_MAGIC_V4L_AUDIO:
probe_v4l(ipipe);
break;
case TC_MAGIC_BKTR_VIDEO:
probe_bktr(ipipe);
break;
case TC_MAGIC_SUNAU_AUDIO:
probe_sunau(ipipe);
break;
case TC_MAGIC_BSDAV:
probe_bsdav(ipipe);
break;
case TC_MAGIC_OSS_AUDIO:
probe_oss(ipipe);
break;
case TC_MAGIC_DVD:
case TC_MAGIC_DVD_PAL:
case TC_MAGIC_DVD_NTSC:
probe_dvd(ipipe);
break;
case TC_MAGIC_XML:
probe_xml(ipipe);
break;
case TC_MAGIC_X11:
probe_x11(ipipe);
break;
default: /* fallback to P.O.D. file... */
probe_file(ipipe);
break; /* for coherency */
}
if (ipipe->magic == TC_MAGIC_XML) {
ipipe->probe_info->magic_xml = TC_MAGIC_XML;
/*
* used in transcode to load import_xml and to have
* the correct type of the video/audio
*/
} else {
ipipe->probe_info->magic_xml = ipipe->probe_info->magic;
}
if (!ipipe->probe_info->asr) {
guess_asr(ipipe->probe_info);
}
return;
}
/*************************************************************************/
/*
* Local variables:
* c-file-style: "stroustrup"
* c-file-offsets: ((case-label . *) (statement-case-intro . *))
* indent-tabs-mode: nil
* End:
*
* vim: expandtab shiftwidth=4:
*/