diff options
Diffstat (limited to 'debian/transcode/transcode-1.1.7/import/import_xml.c')
| -rw-r--r-- | debian/transcode/transcode-1.1.7/import/import_xml.c | 714 |
1 files changed, 714 insertions, 0 deletions
diff --git a/debian/transcode/transcode-1.1.7/import/import_xml.c b/debian/transcode/transcode-1.1.7/import/import_xml.c new file mode 100644 index 00000000..64534b0d --- /dev/null +++ b/debian/transcode/transcode-1.1.7/import/import_xml.c @@ -0,0 +1,714 @@ +/* + * 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); +} + + + |
