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.

715 lines
25 KiB

/*
* import_xml.c
*
* Copyright (C) Marzio Malanchini - March 2002
*
* 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.
*
*/
#define MOD_NAME "import_xml.so"
#define MOD_VERSION "v0.0.8 (2003-07-09)"
#define MOD_CODEC "(video) * | (audio) *"
#include "transcode.h"
#include "tcinfo.h"
#include "libtcvideo/tcvideo.h"
static int verbose_flag = TC_QUIET;
static int capability_flag = -1;
#define MOD_PRE xml
#include "import_def.h"
#include "ioxml.h"
#include "magic.h"
#include "probe_xml.h"
#define M_AUDIOMAX(a,b) (b==LONG_MAX)?LONG_MAX:a*b
#define MAX_BUF 1024
char import_cmd_buf[MAX_BUF];
static FILE *s_fd_video=0;
static FILE *s_fd_audio=0;
static audiovideo_t s_audio,*p_audio=NULL;
static audiovideo_t s_video,*p_video=NULL,*p_video_prev;
static int s_frame_size=0;
static char *p_vframe_buffer=NULL;
static int s_v_codec;
static long s_a_magic;
static long s_v_magic;
static TCVHandle tcvhandle = 0;
int binary_dump=1; //force the use of binary dump to create the correct XML tree
static int f_dim_check(audiovideo_t *p_temp,int *s_new_height,int *s_new_width)
{
int s_rc;
s_rc=0;
if (p_temp->s_v_tg_width==0)
*s_new_width=p_temp->s_v_width;
else
{
s_rc=1;
*s_new_width=p_temp->s_v_tg_width;
}
if (p_temp->s_v_tg_height==0)
*s_new_height=p_temp->s_v_height;
else
{
s_rc=1;
*s_new_height=p_temp->s_v_tg_height;
}
return(s_rc);
}
static int f_calc_frame_size(audiovideo_t *p_temp,int s_codec)
{
int s_new_height,s_new_width;
if (f_dim_check(p_temp,&s_new_height,&s_new_width))
{
switch(s_codec)
{
case CODEC_RGB:
return(3*s_new_width*s_new_height);
break;
default:
return((3*s_new_width*s_new_height)/2);
break;
}
}
return(s_frame_size);
}
static video_filter_t *f_video_filter(char *p_filter)
{
static video_filter_t s_v_filter;
if (p_filter !=NULL)
{
s_v_filter.s_zoom_filter = tcv_zoom_filter_from_string(p_filter);
if (s_v_filter.s_zoom_filter == TCV_ZOOM_NULL);
{
s_v_filter.s_zoom_filter = TCV_ZOOM_LANCZOS3;
}
}
else //"lanczos3" default
{
s_v_filter.s_zoom_filter = TCV_ZOOM_LANCZOS3;
}
return (&s_v_filter);
}
static void f_mod_video_frame(transfer_t *param,audiovideo_t *p_temp,int s_codec,int s_cleanup)
{
static uint8_t *p_pixel_tmp=NULL;
int s_new_height,s_new_width;
static video_filter_t *p_v_filter;
static audiovideo_t *p_tmp=NULL;
if (s_cleanup)
{
if (p_pixel_tmp !=NULL)
free(p_pixel_tmp);
return;
}
if (f_dim_check(p_temp,&s_new_height,&s_new_width))
{
if (p_tmp != p_temp)
{
p_tmp=p_temp;
p_v_filter=f_video_filter(p_temp->p_v_resize_filter);
if(verbose_flag)
tc_log_info(MOD_NAME,"setting resize video filter to %s",
tcv_zoom_filter_to_string(p_v_filter->s_zoom_filter));
}
switch(s_codec)
{
case CODEC_RGB:
if (p_pixel_tmp ==NULL)
p_pixel_tmp = tc_zalloc(3*p_temp->s_v_tg_width * p_temp->s_v_tg_height);
tcv_zoom(tcvhandle, p_vframe_buffer, p_pixel_tmp, p_temp->s_v_width, p_temp->s_v_height, 3, p_temp->s_v_tg_width, p_temp->s_v_tg_height, p_v_filter->s_zoom_filter);
break;
default: {
int Y_size_in = p_temp->s_v_width * p_temp->s_v_height;
int Y_size_out = p_temp->s_v_tg_width * p_temp->s_v_tg_height;
int UV_size_in = (p_temp->s_v_width/2) * (p_temp->s_v_height/2);
int UV_size_out = (p_temp->s_v_tg_width/2) * (p_temp->s_v_tg_height/2);
if (p_pixel_tmp ==NULL)
p_pixel_tmp = tc_zalloc(Y_size_out + 2*UV_size_out);
tcv_zoom(tcvhandle, p_vframe_buffer, p_pixel_tmp, p_temp->s_v_width, p_temp->s_v_height, 1, p_temp->s_v_tg_width, p_temp->s_v_tg_height, p_v_filter->s_zoom_filter);
tcv_zoom(tcvhandle, p_vframe_buffer + Y_size_in, p_pixel_tmp + Y_size_out, p_temp->s_v_width/2, p_temp->s_v_height/2, 1, p_temp->s_v_tg_width/2, p_temp->s_v_tg_height/2, p_v_filter->s_zoom_filter);
tcv_zoom(tcvhandle, p_vframe_buffer + Y_size_in + UV_size_in, p_pixel_tmp + Y_size_out + UV_size_out, p_temp->s_v_width/2, p_temp->s_v_height/2, 1, p_temp->s_v_tg_width/2, p_temp->s_v_tg_height/2, p_v_filter->s_zoom_filter);
}
break;
}
ac_memcpy(param->buffer,p_pixel_tmp,param->size); //copy the new image buffer
}
else
{
ac_memcpy(param->buffer,p_vframe_buffer,param->size); //only copy the original buffer
}
}
/* ------------------------------------------------------------
*
* open stream
*
* ------------------------------------------------------------*/
MOD_open
{
info_t s_info_dummy;
ProbeInfo s_probe_dummy1,s_probe_dummy2;
long s_tot_dummy1,s_tot_dummy2;
int s_frame_audio_size=0;
if(param->flag == TC_VIDEO)
{
param->fd = NULL;
if (p_video == NULL)
{
s_info_dummy.name=vob->video_in_file; //init the video XML input file name
s_info_dummy.verbose=vob->verbose; //init the video XML input file name
if (f_build_xml_tree(&s_info_dummy,&s_video,&s_probe_dummy1,&s_probe_dummy2,&s_tot_dummy1,&s_tot_dummy2) == -1) //create the XML tree
{
f_manage_input_xml(NULL,0,&s_video);
tc_log_warn(MOD_NAME,"file %s has invalid format content.",
vob->video_in_file);
return(TC_IMPORT_ERROR);
}
p_video=s_video.p_next;
}
if (p_video == NULL)
{
tc_log_warn(MOD_NAME,"there isn't no file in %s.",
vob->video_in_file);
return(TC_IMPORT_ERROR);
}
if(p_video->s_v_codec == TC_CODEC_UNKNOWN)
{
if (vob->dv_yuy2_mode == 1)
s_v_codec=CODEC_YUY2;
else if (vob->dv_yuy2_mode == 0)
s_v_codec=CODEC_YUV;
else
s_v_codec=vob->im_v_codec;
}
else
{
s_v_codec=p_video->s_v_codec;
}
s_v_magic=p_video->s_v_magic;
switch(s_v_magic)
{
case TC_MAGIC_DV_PAL:
case TC_MAGIC_DV_NTSC:
capability_flag=TC_CAP_RGB|TC_CAP_YUV|TC_CAP_DV|TC_CAP_PCM;
switch(s_v_codec)
{
case CODEC_RGB:
s_frame_size = 3*(p_video->s_v_width * p_video->s_v_height);
if(tc_snprintf(import_cmd_buf, MAX_BUF, "tcextract -i \"%s\" -x dv -d %d -C %ld-%ld | tcdecode -x dv -y rgb -d %d -Q %d", p_video->p_nome_video,vob->verbose,p_video->s_start_video,p_video->s_end_video,vob->verbose, vob->quality) < 0)
{
tc_log_perror(MOD_NAME, "command buffer overflow");
return(TC_IMPORT_ERROR);
}
break;
case CODEC_YUY2:
s_frame_size = (3*(p_video->s_v_width * p_video->s_v_height))/2;
if(tc_snprintf(import_cmd_buf, MAX_BUF, "tcextract -i \"%s\" -x dv -d %d -C %ld-%ld | tcdecode -x dv -y yuv420p -Y -d %d -Q %d", p_video->p_nome_video,vob->verbose,p_video->s_start_video,p_video->s_end_video,vob->verbose, vob->quality) < 0)
{
tc_log_perror(MOD_NAME, "command buffer overflow");
return(TC_IMPORT_ERROR);
}
break;
case CODEC_YUV:
s_frame_size = (3*(p_video->s_v_width * p_video->s_v_height))/2;
if(tc_snprintf(import_cmd_buf, MAX_BUF, "tcextract -i \"%s\" -x dv -d %d -C %ld-%ld | tcdecode -x dv -y yuv420p -d %d -Q %d", p_video->p_nome_video,vob->verbose,p_video->s_start_video,p_video->s_end_video,vob->verbose, vob->quality) < 0)
{
tc_log_perror(MOD_NAME, "command buffer overflow");
return(TC_IMPORT_ERROR);
}
break;
case CODEC_RAW:
case CODEC_RAW_YUV:
s_frame_size = (p_video->s_v_height==PAL_H) ? TC_FRAME_DV_PAL:TC_FRAME_DV_NTSC;
if(tc_snprintf(import_cmd_buf, MAX_BUF, "tcextract -i \"%s\" -x dv -d %d -C %ld-%ld", p_video->p_nome_video,vob->verbose,p_video->s_start_video,p_video->s_end_video) < 0)
{
tc_log_perror(MOD_NAME, "command buffer overflow");
return(TC_IMPORT_ERROR);
}
break;
default:
tc_log_warn(MOD_NAME, "invalid import codec request 0x%x", s_v_codec);
return(TC_IMPORT_ERROR);
}
break;
case TC_MAGIC_MOV:
capability_flag=TC_CAP_PCM|TC_CAP_RGB|TC_CAP_YUV;
switch(s_v_codec)
{
case CODEC_RGB:
s_frame_size = (3*(p_video->s_v_width * p_video->s_v_height));
if (p_video->s_v_real_codec == TC_CODEC_DV)
{
if(tc_snprintf(import_cmd_buf, MAX_BUF, "tcdecode -x mov -i \"%s\" -d %d -C %ld,%ld -Q %d|tcdecode -x dv -y rgb -d %d -Q %d", p_video->p_nome_video,vob->verbose,p_video->s_start_video,p_video->s_end_video, vob->quality,vob->verbose,vob->quality) < 0)
{
tc_log_perror(MOD_NAME, "command buffer overflow");
return(TC_IMPORT_ERROR);
}
}
else
{
if(tc_snprintf(import_cmd_buf, MAX_BUF, "tcdecode -x mov -y rgb -i \"%s\" -d %d -C %ld,%ld -Q %d", p_video->p_nome_video,vob->verbose,p_video->s_start_video,p_video->s_end_video, vob->quality) < 0)
{
tc_log_perror(MOD_NAME, "command buffer overflow");
return(TC_IMPORT_ERROR);
}
}
break;
case CODEC_YUV:
s_frame_size = (3*(p_video->s_v_width * p_video->s_v_height))/2;
if (p_video->s_v_real_codec == TC_CODEC_DV)
{
if(tc_snprintf(import_cmd_buf, MAX_BUF, "tcdecode -x mov -i \"%s\" -d %d -C %ld,%ld -Q %d|tcdecode -x dv -y yuv420p -d %d -Q %d", p_video->p_nome_video,vob->verbose,p_video->s_start_video,p_video->s_end_video, vob->quality,vob->verbose,vob->quality) < 0)
{
tc_log_perror(MOD_NAME, "command buffer overflow");
return(TC_IMPORT_ERROR);
}
}
else
{
if(tc_snprintf(import_cmd_buf, MAX_BUF, "tcdecode -x mov -y yuv2 -i \"%s\" -d %d -C %ld,%ld -Q %d", p_video->p_nome_video,vob->verbose,p_video->s_start_video,p_video->s_end_video, vob->quality) < 0)
{
tc_log_perror(MOD_NAME, "command buffer overflow");
return(TC_IMPORT_ERROR);
}
}
break;
default:
tc_log_warn(MOD_NAME, "invalid import codec request 0x%x", s_v_codec);
return(TC_IMPORT_ERROR);
}
break;
case TC_MAGIC_AVI:
capability_flag=TC_CAP_PCM|TC_CAP_RGB|TC_CAP_AUD|TC_CAP_VID;
switch(s_v_codec)
{
case CODEC_RGB:
s_frame_size = (3*(p_video->s_v_width * p_video->s_v_height));
if(tc_snprintf(import_cmd_buf, MAX_BUF, "tcextract -i \"%s\" -x avi -d %d -C %ld-%ld", p_video->p_nome_video,vob->verbose,p_video->s_start_video,p_video->s_end_video) < 0)
{
tc_log_perror(MOD_NAME, "command buffer overflow");
return(TC_IMPORT_ERROR);
}
break;
default:
tc_log_warn(MOD_NAME,"video codec 0x%x not yet supported.", s_v_codec);
return(TC_IMPORT_ERROR);
;
}
break;
default:
tc_log_warn(MOD_NAME,"video magic 0x%lx not yet supported.", s_v_magic);
return(TC_IMPORT_ERROR);
}
if((s_fd_video = popen(import_cmd_buf, "r"))== NULL)
{
tc_log_warn(MOD_NAME,"Error cannot open the pipe.");
return(TC_IMPORT_ERROR);
}
param->size=f_calc_frame_size(p_video,s_v_codec); //setting the frame size
p_vframe_buffer=tc_malloc(s_frame_size);
if(verbose_flag)
tc_log_info(MOD_NAME,"setting target video size to %d",param->size);
if (!tcvhandle && !(tcvhandle = tcv_init()))
{
tc_log_error(MOD_NAME, "tcv_init() failed");
return(TC_IMPORT_ERROR);
}
p_video_prev=p_video;
p_video=p_video->p_next;
if(verbose_flag)
tc_log_info(MOD_NAME, "%s", import_cmd_buf);
return(0);
}
if(param->flag == TC_AUDIO)
{
param->fd = NULL;
if (p_audio== NULL)
{
if (vob->audio_in_file !=NULL)
s_info_dummy.name=vob->audio_in_file; //init the video XML input file name
else
s_info_dummy.name=vob->video_in_file; //init the video XML input file name
s_info_dummy.verbose=vob->verbose; //init the video XML input file name
if (f_build_xml_tree(&s_info_dummy,&s_audio,&s_probe_dummy1,&s_probe_dummy2,&s_tot_dummy1,&s_tot_dummy2) == -1) //create the XML tree
{
f_manage_input_xml(NULL,0,&s_audio);
tc_log_warn(MOD_NAME,"file %s has invalid format content.", vob->audio_in_file);
return(TC_IMPORT_ERROR);
}
p_audio=s_audio.p_next;
}
if (p_audio == NULL)
{
tc_log_warn(MOD_NAME,"there isn't no file in %s.", vob->audio_in_file);
return(TC_IMPORT_ERROR);
}
s_frame_audio_size=(1.00 * p_audio->s_a_bits * p_audio->s_a_chan * p_audio->s_a_rate)/(8*p_audio->s_fps);
if(verbose_flag)
tc_log_info(MOD_NAME,"setting audio size to %d",s_frame_audio_size);
s_a_magic=p_audio->s_a_magic;
switch(s_a_magic)
{
case TC_MAGIC_DV_PAL:
case TC_MAGIC_DV_NTSC:
capability_flag=TC_CAP_RGB|TC_CAP_YUV|TC_CAP_DV|TC_CAP_PCM;
if(tc_snprintf(import_cmd_buf, MAX_BUF, "tcextract -i \"%s\" -d %d -x dv -C %ld-%ld | tcdecode -x dv -y pcm -d %d -Q %d", p_audio->p_nome_audio, vob->verbose,M_AUDIOMAX(s_frame_audio_size,p_audio->s_start_audio),M_AUDIOMAX(s_frame_audio_size,p_audio->s_end_audio),vob->verbose,vob->quality) < 0)
{
tc_log_perror(MOD_NAME, "command buffer overflow");
return(TC_IMPORT_ERROR);
}
break;
case TC_MAGIC_AVI:
capability_flag=TC_CAP_PCM|TC_CAP_RGB|TC_CAP_AUD|TC_CAP_VID;
if(tc_snprintf(import_cmd_buf, MAX_BUF, "tcextract -i \"%s\" -d %d -x pcm -a %d -C %ld-%ld",p_audio->p_nome_audio, vob->verbose,vob->a_track,M_AUDIOMAX(s_frame_audio_size,p_audio->s_start_audio),M_AUDIOMAX(s_frame_audio_size,p_audio->s_end_audio)) < 0)
{
tc_log_perror(MOD_NAME, "command buffer overflow");
return(TC_IMPORT_ERROR);
}
break;
case TC_MAGIC_MOV:
capability_flag=TC_CAP_PCM|TC_CAP_RGB|TC_CAP_YUV;
if (p_audio->s_a_bits == 16)
s_frame_audio_size >>= 1;
if (p_audio->s_a_chan == 2)
s_frame_audio_size >>= 1;
if(tc_snprintf(import_cmd_buf, MAX_BUF, "tcdecode -i \"%s\" -d %d -x mov -y pcm -C %ld,%ld",p_audio->p_nome_audio, vob->verbose,M_AUDIOMAX(s_frame_audio_size,p_audio->s_start_audio),M_AUDIOMAX(s_frame_audio_size,p_audio->s_end_audio)) < 0)
{
tc_log_perror(MOD_NAME, "command buffer overflow");
return(TC_IMPORT_ERROR);
}
break;
default:
tc_log_warn(MOD_NAME,"audio magic 0x%lx not yet supported.",s_a_magic);
return(TC_IMPORT_ERROR);
}
if((s_fd_audio = popen(import_cmd_buf, "r"))== NULL)
{
tc_log_warn(MOD_NAME,"Error cannot open the pipe.");
return(TC_IMPORT_ERROR);
}
p_audio=p_audio->p_next;
if(verbose_flag)
tc_log_info(MOD_NAME, "%s", import_cmd_buf);
return(0);
}
return(TC_IMPORT_ERROR);
}
/* ------------------------------------------------------------
*
* decode stream
*
* ------------------------------------------------------------*/
MOD_decode
{
int s_audio_frame_size;
int s_video_frame_size;
static int s_audio_frame_size_orig=0;
static int s_video_frame_size_orig=0;
int s_frame_audio_size=0;
if(param->flag == TC_AUDIO)
{
if (param->size < s_audio_frame_size_orig)
{
param->size=s_audio_frame_size_orig;
s_audio_frame_size_orig=0;
}
s_audio_frame_size=fread(param->buffer, 1, param->size, s_fd_audio);
if (s_audio_frame_size == 0)
{
if (p_audio != NULL) // is there a file ?
{
s_frame_audio_size=(1.00 * p_audio->s_a_bits * p_audio->s_a_chan * p_audio->s_a_rate)/(8*p_audio->s_fps);
if(verbose_flag)
tc_log_info(MOD_NAME,"setting audio size to %d",s_frame_audio_size);
s_a_magic=p_audio->s_a_magic;
switch(s_a_magic)
{
case TC_MAGIC_DV_PAL:
case TC_MAGIC_DV_NTSC:
if(tc_snprintf(import_cmd_buf, MAX_BUF, "tcextract -i \"%s\" -d %d -x dv -C %ld-%ld | tcdecode -x dv -y pcm -d %d -Q %d", p_audio->p_nome_audio, vob->verbose,M_AUDIOMAX(s_frame_audio_size,p_audio->s_start_audio),M_AUDIOMAX(s_frame_audio_size,p_audio->s_end_audio),vob->verbose,vob->quality) < 0)
{
tc_log_perror(MOD_NAME, "command buffer overflow");
return(TC_IMPORT_ERROR);
}
break;
case TC_MAGIC_AVI:
if(tc_snprintf(import_cmd_buf, MAX_BUF, "tcextract -i \"%s\" -d %d -x pcm -a %d -C %ld-%ld",p_audio->p_nome_audio, vob->verbose,vob->a_track,M_AUDIOMAX(s_frame_audio_size,p_audio->s_start_audio),M_AUDIOMAX(s_frame_audio_size,p_audio->s_end_audio)) < 0)
{
tc_log_perror(MOD_NAME, "command buffer overflow");
return(TC_IMPORT_ERROR);
}
break;
case TC_MAGIC_MOV:
if (p_audio->s_a_bits == 16)
s_frame_audio_size >>= 1;
if (p_audio->s_a_chan == 2)
s_frame_audio_size >>= 1;
if(tc_snprintf(import_cmd_buf, MAX_BUF, "tcdecode -i \"%s\" -d %d -x mov -y pcm -C %ld,%ld",p_audio->p_nome_audio, vob->verbose,M_AUDIOMAX(s_frame_audio_size,p_audio->s_start_audio),M_AUDIOMAX(s_frame_audio_size,p_audio->s_end_audio)) < 0)
{
tc_log_perror(MOD_NAME, "command buffer overflow");
return(TC_IMPORT_ERROR);
}
break;
default:
tc_log_warn(MOD_NAME,"audio magic 0x%lx not yet supported.",s_a_magic);
return(TC_IMPORT_ERROR);
}
if((s_fd_audio = popen(import_cmd_buf, "r"))== NULL)
{
tc_log_warn(MOD_NAME,"Error cannot open the pipe.");
return(TC_IMPORT_ERROR);
}
if(verbose_flag)
tc_log_info(MOD_NAME, "%s", import_cmd_buf);
p_audio=p_audio->p_next;
}
else
{
return(TC_IMPORT_ERROR);
}
s_audio_frame_size=fread(param->buffer, 1,param->size, s_fd_audio);
}
if (param->size > s_audio_frame_size)
{
s_audio_frame_size_orig=param->size;
param->size=s_audio_frame_size;
}
return(0);
}
if(param->flag == TC_VIDEO)
{
if (s_frame_size < s_video_frame_size_orig)
{
s_frame_size=s_video_frame_size_orig;
s_video_frame_size_orig=0;
}
s_video_frame_size=fread(p_vframe_buffer, 1,s_frame_size, s_fd_video);
f_mod_video_frame(param,p_video_prev,s_v_codec,0);
if (s_video_frame_size == 0)
{
if (p_video !=NULL) // is there a file ?
{
if(p_video->s_v_codec == TC_CODEC_UNKNOWN)
{
if (vob->dv_yuy2_mode == 1)
s_v_codec=CODEC_YUY2;
else if (vob->dv_yuy2_mode == 0)
s_v_codec=CODEC_YUV;
else
s_v_codec=vob->im_v_codec;
}
else
{
s_v_codec=p_video->s_v_codec;
}
s_v_magic=p_video->s_v_magic;
switch(s_v_magic)
{
case TC_MAGIC_DV_PAL:
case TC_MAGIC_DV_NTSC:
switch(s_v_codec)
{
case CODEC_RGB:
s_frame_size = 3*(p_video->s_v_width * p_video->s_v_height);
if(tc_snprintf(import_cmd_buf, MAX_BUF, "tcextract -i \"%s\" -x dv -d %d -C %ld-%ld | tcdecode -x dv -y rgb -d %d -Q %d", p_video->p_nome_video,vob->verbose,p_video->s_start_video,p_video->s_end_video,vob->verbose, vob->quality) < 0)
{
tc_log_perror(MOD_NAME, "command buffer overflow");
return(TC_IMPORT_ERROR);
}
break;
case CODEC_YUY2:
s_frame_size = (3*(p_video->s_v_width * p_video->s_v_height))/2;
if(tc_snprintf(import_cmd_buf, MAX_BUF, "tcextract -i \"%s\" -x dv -d %d -C %ld-%ld | tcdecode -x dv -y yuv420p -Y -d %d -Q %d", p_video->p_nome_video,vob->verbose,p_video->s_start_video,p_video->s_end_video,vob->verbose, vob->quality) < 0)
{
tc_log_perror(MOD_NAME, "command buffer overflow");
return(TC_IMPORT_ERROR);
}
break;
case CODEC_YUV:
s_frame_size = (3*(p_video->s_v_width * p_video->s_v_height))/2;
if(tc_snprintf(import_cmd_buf, MAX_BUF, "tcextract -i \"%s\" -x dv -d %d -C %ld-%ld | tcdecode -x dv -y yuv420p -d %d -Q %d", p_video->p_nome_video,vob->verbose,p_video->s_start_video,p_video->s_end_video,vob->verbose, vob->quality) < 0)
{
tc_log_perror(MOD_NAME, "command buffer overflow");
return(TC_IMPORT_ERROR);
}
break;
case CODEC_RAW:
case CODEC_RAW_YUV:
s_frame_size = (p_video->s_v_height==PAL_H) ? TC_FRAME_DV_PAL:TC_FRAME_DV_NTSC;
if(tc_snprintf(import_cmd_buf, MAX_BUF, "tcextract -i \"%s\" -x dv -d %d -C %ld-%ld", p_video->p_nome_video,vob->verbose,p_video->s_start_video,p_video->s_end_video) < 0)
{
tc_log_perror(MOD_NAME, "command buffer overflow");
return(TC_IMPORT_ERROR);
}
break;
default:
;;
}
break;
case TC_MAGIC_MOV:
switch(s_v_codec)
{
case CODEC_RGB:
s_frame_size = (3*(p_video->s_v_width * p_video->s_v_height));
if (p_video->s_v_real_codec == TC_CODEC_DV)
{
if(tc_snprintf(import_cmd_buf, MAX_BUF, "tcdecode -x mov -i \"%s\" -d %d -C %ld,%ld -Q %d|tcdecode -x dv -y rgb -d %d -Q %d", p_video->p_nome_video,vob->verbose,p_video->s_start_video,p_video->s_end_video, vob->quality,vob->verbose,vob->quality) < 0)
{
tc_log_perror(MOD_NAME, "command buffer overflow");
return(TC_IMPORT_ERROR);
}
}
else
{
if(tc_snprintf(import_cmd_buf, MAX_BUF, "tcdecode -x mov -y rgb -i \"%s\" -d %d -C %ld,%ld -Q %d", p_video->p_nome_video,vob->verbose,p_video->s_start_video,p_video->s_end_video, vob->quality) < 0)
{
tc_log_perror(MOD_NAME, "command buffer overflow");
return(TC_IMPORT_ERROR);
}
}
break;
case CODEC_YUV:
s_frame_size = (3*(p_video->s_v_width * p_video->s_v_height))/2;
if (p_video->s_v_real_codec == TC_CODEC_DV)
{
if(tc_snprintf(import_cmd_buf, MAX_BUF, "tcdecode -x mov -i \"%s\" -d %d -C %ld,%ld -Q %d|tcdecode -x dv -y yuv420p -d %d -Q %d", p_video->p_nome_video,vob->verbose,p_video->s_start_video,p_video->s_end_video, vob->quality,vob->verbose,vob->quality) < 0)
{
tc_log_perror(MOD_NAME, "command buffer overflow");
return(TC_IMPORT_ERROR);
}
}
else
{
if(tc_snprintf(import_cmd_buf, MAX_BUF, "tcdecode -x mov -y yuv2 -i \"%s\" -d %d -C %ld,%ld -Q %d", p_video->p_nome_video,vob->verbose,p_video->s_start_video,p_video->s_end_video, vob->quality) < 0)
{
tc_log_perror(MOD_NAME, "command buffer overflow");
return(TC_IMPORT_ERROR);
}
}
break;
default:
;;
}
break;
case TC_MAGIC_AVI:
switch(s_v_codec)
{
case CODEC_RGB:
s_frame_size = (3*(p_video->s_v_width * p_video->s_v_height));
if(tc_snprintf(import_cmd_buf, MAX_BUF, "tcextract -i \"%s\" -x avi -d %d -C %ld-%ld", p_video->p_nome_video,vob->verbose,p_video->s_start_video,p_video->s_end_video) < 0)
{
tc_log_perror(MOD_NAME, "command buffer overflow");
return(TC_IMPORT_ERROR);
}
break;
default:
tc_log_warn(MOD_NAME,"video codec 0x%x not yet supported.",s_v_codec);
return(TC_IMPORT_ERROR);
;
}
break;
default:
tc_log_warn(MOD_NAME,"video magic 0x%lx not yet supported.",s_v_magic);
return(TC_IMPORT_ERROR);
}
if((s_fd_video = popen(import_cmd_buf, "r"))== NULL)
{
tc_log_warn(MOD_NAME,"Error cannot open the pipe.");
return(TC_IMPORT_ERROR);
}
param->size=f_calc_frame_size(p_video,s_v_codec); //setting the frame size
if(verbose_flag)
tc_log_info(MOD_NAME,"setting target video size to %d",param->size);
p_video_prev=p_video;
p_video=p_video->p_next;
if(verbose_flag)
tc_log_info(MOD_NAME, "%s", import_cmd_buf);
}
else
{
return(TC_IMPORT_ERROR);
}
s_video_frame_size=fread(p_vframe_buffer, 1,s_frame_size, s_fd_video); //read the new frame
f_mod_video_frame(param,p_video_prev,s_v_codec,0);
}
if (s_frame_size > s_video_frame_size)
{
s_video_frame_size_orig=s_frame_size;
s_frame_size=s_video_frame_size;
}
return(0);
}
return(TC_IMPORT_ERROR);
}
/* ------------------------------------------------------------
*
* close stream
*
* ------------------------------------------------------------*/
MOD_close
{
if(param->flag == TC_AUDIO)
{
s_fd_audio=0;
param->fd=NULL;
return(0);
}
if(param->flag == TC_VIDEO)
{
f_mod_video_frame(NULL,NULL,0,1); //cleanup
s_fd_video=0;
param->fd=NULL;
tcv_free(tcvhandle);
tcvhandle = 0;
return(0);
}
return(TC_IMPORT_ERROR);
}