/* * 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); }