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.
258 lines
7.4 KiB
258 lines
7.4 KiB
4 years ago
|
/*
|
||
|
* tcxmlcheck.c
|
||
|
*
|
||
|
* Copyright (C) Malanchini Marzio - March 2003
|
||
|
*
|
||
|
* 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 <math.h>
|
||
|
|
||
|
#include "ioxml.h"
|
||
|
#include "ioaux.h"
|
||
|
#include "magic.h"
|
||
|
|
||
|
#define EXE "tcxmlcheck"
|
||
|
|
||
|
#define MAX_BUF 1024
|
||
|
#define VIDEO_MODE 0x01
|
||
|
#define AUDIO_MODE 0x02
|
||
|
|
||
|
void version(void)
|
||
|
{
|
||
|
/* print id string to stderr */
|
||
|
fprintf(stderr, "%s (%s v%s) (C) 2001-2003 Thomas Oestreich,"
|
||
|
" 2003-2010 Transcode Team\n",
|
||
|
EXE, PACKAGE, VERSION);
|
||
|
}
|
||
|
|
||
|
static void usage(int status)
|
||
|
{
|
||
|
version();
|
||
|
fprintf(stderr,"\nUsage: %s [options] [-]\n", EXE);
|
||
|
#ifdef HAVE_LIBXML2
|
||
|
fprintf(stderr," -i name input video/audio xml file [stdin]\n");
|
||
|
fprintf(stderr," -p name input audio xml file [none]\n");
|
||
|
fprintf(stderr," -B binary output to stdout (used by transcode) [off]\n");
|
||
|
fprintf(stderr," -S write stdin into shared memory (used by transcode)[off]\n");
|
||
|
fprintf(stderr," -V check only video file input [off]\n");
|
||
|
fprintf(stderr," -A check only audio file input [off]\n");
|
||
|
#endif
|
||
|
fprintf(stderr," -v print version\n");
|
||
|
|
||
|
exit(status);
|
||
|
}
|
||
|
|
||
|
#ifdef HAVE_LIBXML2
|
||
|
|
||
|
int binary_dump = 1; //force to use the binary dump in probe_xml
|
||
|
|
||
|
|
||
|
/* ------------------------------------------------------------
|
||
|
*
|
||
|
* print a usage/version message
|
||
|
*
|
||
|
* ------------------------------------------------------------*/
|
||
|
|
||
|
|
||
|
|
||
|
static int f_complete_vob_info(vob_t *p_vob,int s_type_check)
|
||
|
{
|
||
|
audiovideo_t s_audiovideo;
|
||
|
int s_rc;
|
||
|
|
||
|
s_rc=0;
|
||
|
if ((s_type_check & VIDEO_MODE) !=0)
|
||
|
{
|
||
|
if( p_vob->video_in_file != NULL)
|
||
|
{
|
||
|
int err = f_manage_input_xml(p_vob->video_in_file,1,&s_audiovideo);
|
||
|
if(err)
|
||
|
{
|
||
|
tc_log_error(EXE,"Error parsing XML %s file",p_vob->video_in_file);
|
||
|
if (err == 1) {
|
||
|
/* free tree */
|
||
|
f_manage_input_xml(NULL,0,&s_audiovideo);
|
||
|
}
|
||
|
return(1);
|
||
|
}
|
||
|
if (s_audiovideo.p_next->s_v_codec != TC_CODEC_UNKNOWN)
|
||
|
p_vob->im_v_codec=s_audiovideo.p_next->s_v_codec;
|
||
|
if (s_audiovideo.p_next->s_a_codec != TC_CODEC_UNKNOWN)
|
||
|
p_vob->im_a_codec=s_audiovideo.p_next->s_a_codec;
|
||
|
if ((s_audiovideo.p_next->s_v_tg_height !=0) || (s_audiovideo.p_next->s_v_tg_width !=0))
|
||
|
s_rc=2;
|
||
|
(void) f_manage_input_xml(NULL,0,&s_audiovideo);
|
||
|
}
|
||
|
}
|
||
|
if ((s_type_check & AUDIO_MODE) !=0)
|
||
|
{
|
||
|
if( p_vob->audio_in_file != NULL) //there is an xml file for audio?
|
||
|
{
|
||
|
if( f_manage_input_xml(p_vob->audio_in_file,1,&s_audiovideo))
|
||
|
{
|
||
|
tc_log_error(EXE,"Error parsing XML %s file",p_vob->video_in_file);
|
||
|
(void) f_manage_input_xml(NULL,0,&s_audiovideo);
|
||
|
return(1);
|
||
|
}
|
||
|
if (s_audiovideo.p_next->s_a_codec != TC_CODEC_UNKNOWN)
|
||
|
p_vob->im_a_codec=s_audiovideo.p_next->s_a_codec;
|
||
|
(void) f_manage_input_xml(NULL,0,&s_audiovideo);
|
||
|
}
|
||
|
}
|
||
|
return(s_rc);
|
||
|
}
|
||
|
|
||
|
/* ------------------------------------------------------------
|
||
|
*
|
||
|
* check the consistence of XML file
|
||
|
*
|
||
|
* ------------------------------------------------------------*/
|
||
|
|
||
|
int main(int argc, char *argv[])
|
||
|
{
|
||
|
|
||
|
vob_t s_vob;
|
||
|
const char *p_in_v_file="/dev/stdin",*p_in_a_file=NULL,*p_audio_tmp=NULL,*p_video_tmp=NULL;
|
||
|
pid_t s_pid;
|
||
|
int s_bin_dump=0,s_type_check=VIDEO_MODE|AUDIO_MODE;
|
||
|
int s_rc,s_cmd;
|
||
|
|
||
|
//proper initialization
|
||
|
memset(&s_vob, 0, sizeof(vob_t));
|
||
|
s_pid=getpid();
|
||
|
|
||
|
|
||
|
s_vob.audio_in_file= "/dev/zero";
|
||
|
s_vob.video_in_file= "/dev/zero";
|
||
|
|
||
|
libtc_init(&argc, &argv);
|
||
|
|
||
|
while ((s_cmd = getopt(argc, argv, "i:p:vSBAVh")) != -1)
|
||
|
{
|
||
|
switch (s_cmd)
|
||
|
{
|
||
|
case 'i':
|
||
|
if(optarg[0]=='-')
|
||
|
usage(EXIT_FAILURE);
|
||
|
p_in_v_file = optarg;
|
||
|
break;
|
||
|
case 'p':
|
||
|
if(optarg[0]=='-')
|
||
|
usage(EXIT_FAILURE);
|
||
|
p_in_a_file = optarg;
|
||
|
break;
|
||
|
case 'B':
|
||
|
s_bin_dump = 1;
|
||
|
break;
|
||
|
case 'A':
|
||
|
s_type_check = AUDIO_MODE;
|
||
|
break;
|
||
|
case 'V':
|
||
|
s_type_check = VIDEO_MODE;
|
||
|
break;
|
||
|
case 'v':
|
||
|
version();
|
||
|
exit(0);
|
||
|
break;
|
||
|
case 'h':
|
||
|
usage(EXIT_SUCCESS);
|
||
|
default:
|
||
|
usage(EXIT_FAILURE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(optind < argc)
|
||
|
{
|
||
|
if(strcmp(argv[optind],"-")!=0)
|
||
|
usage(EXIT_FAILURE);
|
||
|
}
|
||
|
// need at least a file name
|
||
|
if(argc==1)
|
||
|
usage(EXIT_FAILURE);
|
||
|
/* ------------------------------------------------------------
|
||
|
*
|
||
|
* fill out defaults for info structure
|
||
|
*
|
||
|
* ------------------------------------------------------------*/
|
||
|
|
||
|
if (s_bin_dump)
|
||
|
{
|
||
|
if((tc_pread(STDIN_FILENO, (uint8_t *) &s_vob, sizeof(vob_t))) != sizeof(vob_t))
|
||
|
{
|
||
|
tc_log_error(EXE,"Error reading data from stdin");
|
||
|
exit(1);
|
||
|
}
|
||
|
p_video_tmp=s_vob.video_in_file;
|
||
|
p_audio_tmp=s_vob.audio_in_file;
|
||
|
}
|
||
|
if(p_in_v_file==NULL)
|
||
|
{
|
||
|
s_vob.video_in_file= p_in_v_file;
|
||
|
if(p_in_a_file==NULL)
|
||
|
s_vob.audio_in_file= p_in_a_file;
|
||
|
else
|
||
|
s_vob.audio_in_file= p_in_a_file;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
s_vob.video_in_file= p_in_v_file;
|
||
|
if(p_in_a_file==NULL)
|
||
|
s_vob.audio_in_file= p_in_v_file;
|
||
|
else
|
||
|
s_vob.audio_in_file= p_in_a_file;
|
||
|
}
|
||
|
|
||
|
|
||
|
/* ------------------------------------------------------------
|
||
|
*
|
||
|
* start with the program
|
||
|
*
|
||
|
* ------------------------------------------------------------*/
|
||
|
if ((s_rc=f_complete_vob_info(&s_vob,s_type_check)) == 1)
|
||
|
return(1);
|
||
|
else
|
||
|
{
|
||
|
if (s_bin_dump)
|
||
|
{
|
||
|
s_vob.video_in_file=p_video_tmp;
|
||
|
s_vob.audio_in_file=p_audio_tmp;
|
||
|
if(tc_pwrite(STDOUT_FILENO, (uint8_t *) &s_vob, sizeof(vob_t)) != sizeof(vob_t))
|
||
|
{
|
||
|
tc_log_error(EXE,"Error writing data to stdout");
|
||
|
exit(1);
|
||
|
}
|
||
|
if(tc_pwrite(STDOUT_FILENO, (uint8_t *)&s_rc, sizeof(int)) != sizeof(int))
|
||
|
{
|
||
|
tc_log_error(EXE,"Error writing data to stdout");
|
||
|
exit(1);
|
||
|
}
|
||
|
}
|
||
|
return(0);
|
||
|
}
|
||
|
}
|
||
|
#else
|
||
|
int main(int argc, char *argv[])
|
||
|
{
|
||
|
usage(EXIT_SUCCESS);
|
||
|
return(EXIT_SUCCESS); // Avoid a compiler warning
|
||
|
}
|
||
|
#endif
|