+++ /dev/null
-
-/*
- * CINELERRA
- * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
- *
- * This program 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 of the License, or
- * (at your option) any later version.
- *
- * This program 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 this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "asset.h"
-#include "bcprogressbox.h"
-#include "bcsignals.h"
-#include "bitspopup.h"
-#include "byteorder.h"
-#include "clip.h"
-#include "commercials.h"
-#include "condition.h"
-#include "cstrdup.h"
-#include "edit.h"
-#include "file.h"
-#include "filempeg.h"
-#include "filesystem.h"
-#include "format.inc"
-#include "guicast.h"
-#include "indexfile.h"
-#include "indexstate.h"
-#include "language.h"
-#include "mainerror.h"
-#include "mwindow.h"
-#include "pipe.h"
-#include "preferences.h"
-#include "removefile.h"
-#include "vframe.h"
-#include "videodevice.inc"
-
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-
-#define HVPEG_EXE "/hveg2enc"
-#define MJPEG_EXE "/mpeg2enc"
-
-
-// M JPEG dependancies
-static double frame_rate_codes[] =
-{
- 0,
- 24000.0/1001.0,
- 24.0,
- 25.0,
- 30000.0/1001.0,
- 30.0,
- 50.0,
- 60000.0/1001.0,
- 60.0
-};
-
-static double aspect_ratio_codes[] =
-{
- 0,
- 1.0,
- 1.333,
- 1.777,
- 2.21
-};
-
-
-
-
-
-
-
-
-FileMPEG::FileMPEG(Asset *asset, File *file)
- : FileBase(asset, file)
-{
- reset_parameters();
-// May also be VMPEG or AMPEG if write status.
- if(asset->format == FILE_UNKNOWN) asset->format = FILE_MPEG;
- asset->byte_order = 0;
- next_frame_lock = new Condition(0, "FileMPEG::next_frame_lock");
- next_frame_done = new Condition(0, "FileMPEG::next_frame_done");
- vcommand_line.set_array_delete();
-}
-
-FileMPEG::~FileMPEG()
-{
- close_file();
- delete next_frame_lock;
- delete next_frame_done;
- vcommand_line.remove_all_objects();
-}
-
-void FileMPEG::get_parameters(BC_WindowBase *parent_window,
- Asset *asset,
- BC_WindowBase* &format_window,
- int audio_options,
- int video_options)
-{
- if(audio_options && asset->format == FILE_AMPEG)
- {
- MPEGConfigAudio *window = new MPEGConfigAudio(parent_window, asset);
- format_window = window;
- window->create_objects();
- window->run_window();
- delete window;
- }
- else
- if(video_options && asset->format == FILE_VMPEG)
- {
- MPEGConfigVideo *window = new MPEGConfigVideo(parent_window, asset);
- format_window = window;
- window->create_objects();
- window->run_window();
- delete window;
- }
-}
-
-int FileMPEG::check_sig(Asset *asset)
-{
- return mpeg3_check_sig(asset->path);
-}
-
-void FileMPEG::get_info(char *title_path, char *path, char *text, int len)
-{
- mpeg3_t *fd;
- *text = 0;
-
- int result = 0;
- int zio_access = ZIO_UNBUFFERED+ZIO_SINGLE_ACCESS;
- if( !(fd=mpeg3_zopen(title_path, path, &result,zio_access)) ) result = 1;
- if( !result ) result = mpeg3_create_title(fd, 0);
- if( result ) return;
-
- char *cp = text, *ep = text + len-1;
- if( mpeg3_has_toc(fd) ) {
- cp += snprintf(cp,ep-cp, _("toc path:%s\n"), path);
- cp += snprintf(cp,ep-cp, _("title path:\n"));
- for( int i=0; i<100; ++i ) {
- char *title_path = mpeg3_title_path(fd,i);
- if( !title_path ) break;
- cp += snprintf(cp,ep-cp, " %2d. %s\n", i+1, title_path);
- }
- }
- else
- cp += snprintf(cp,ep-cp, _("file path:%s\n"), path);
- int64_t bytes = mpeg3_get_bytes(fd);
- char string[BCTEXTLEN];
- sprintf(string,"%ld",bytes);
- Units::punctuate(string);
- cp += snprintf(cp,ep-cp, _("size: %s"), string);
-
- if( mpeg3_is_program_stream(fd) )
- cp += snprintf(cp,ep-cp, _(" program stream\n"));
- else if( mpeg3_is_transport_stream(fd) )
- cp += snprintf(cp,ep-cp, _(" transport stream\n"));
- else if( mpeg3_is_video_stream(fd) )
- cp += snprintf(cp,ep-cp, _(" video stream\n"));
- else if( mpeg3_is_audio_stream(fd) )
- cp += snprintf(cp,ep-cp, _(" audio stream\n"));
-
- int64_t sdate = mpeg3_get_source_date(fd);
- if( !sdate ) {
- struct stat64 ostat;
- memset(&ostat,0,sizeof(struct stat64));
- sdate = stat64(path, &ostat) < 0 ? 0 : ostat.st_mtime;
- }
- time_t tm = (time_t)sdate;
- cp += snprintf(cp,ep-cp, _("date: %s\n"), ctime(&tm));
-
- int vtrks = mpeg3_total_vstreams(fd);
- cp += snprintf(cp,ep-cp, _("%d video tracks\n"), vtrks);
- for( int vtrk=0; vtrk<vtrks; ++vtrk ) {
- int cmdl = mpeg3_colormodel(fd, vtrk);
- int color_model = bc_colormodel(cmdl);
- char *cmodel = MPEGColorModel::cmodel_to_string(color_model);
- int width = mpeg3_video_width(fd, vtrk);
- int height = mpeg3_video_height(fd, vtrk);
- cp += snprintf(cp,ep-cp, _(" v%d %s %dx%d"), vtrk, cmodel, width, height);
- double frame_rate = mpeg3_frame_rate(fd, vtrk);
- int64_t frames = mpeg3_video_frames(fd, vtrk);
- cp += snprintf(cp,ep-cp, _(" (%5.2f), %ld frames"), frame_rate, frames);
- if( frame_rate > 0 ) {
- double secs = (double)frames / frame_rate;
- cp += snprintf(cp,ep-cp, _(" (%0.3f secs)"),secs);
- }
- *cp++ = '\n';
- }
- int atrks = mpeg3_total_astreams(fd);
- cp += snprintf(cp,ep-cp, _("%d audio tracks\n"), atrks);
- for( int atrk=0; atrk<atrks; ++atrk) {
- const char *format = mpeg3_audio_format(fd, atrk);
- cp += snprintf(cp,ep-cp, _(" a%d %s"), atrk, format);
- int channels = mpeg3_audio_channels(fd, atrk);
- int sample_rate = mpeg3_sample_rate(fd, atrk);
- cp += snprintf(cp,ep-cp, _(" ch%d (%d)"), channels, sample_rate);
- int64_t samples = mpeg3_audio_samples(fd, atrk);
- cp += snprintf(cp,ep-cp, " %ld",samples);
- int64_t nudge = mpeg3_get_audio_nudge(fd, atrk);
- *cp++ = nudge >= 0 ? '+' : (nudge=-nudge, '-');
- cp += snprintf(cp,ep-cp, _("%ld samples"),nudge);
- if( sample_rate > 0 ) {
- double secs = (double)(samples+nudge) / sample_rate;
- cp += snprintf(cp,ep-cp, _(" (%0.3f secs)"),secs);
- }
- *cp++ = '\n';
- }
- int stracks = mpeg3_subtitle_tracks(fd);
- if( stracks > 0 ) {
- cp += snprintf(cp,ep-cp, _("%d subtitles\n"), stracks);
- }
- int vts_titles = mpeg3_get_total_vts_titles(fd);
- if( vts_titles > 0 )
- cp += snprintf(cp,ep-cp, _("%d title sets, "), vts_titles);
- int interleaves = mpeg3_get_total_interleaves(fd);
- if( interleaves > 0 )
- cp += snprintf(cp,ep-cp, _("%d interleaves\n"), interleaves);
- int vts_title = mpeg3_set_vts_title(fd, -1);
- int angle = mpeg3_set_angle(fd, -1);
- int interleave = mpeg3_set_interleave(fd, -1);
- int program = mpeg3_set_program(fd, -1);
- cp += snprintf(cp,ep-cp, _("current program %d = title %d, angle %d, interleave %d\n\n"),
- program, vts_title, angle, interleave);
-
- ArrayList<double> cell_times;
- int cell_no = 0; double cell_time;
- while( !mpeg3_get_cell_time(fd, cell_no++, &cell_time) ) {
- cell_times.append(cell_time);
- }
- if( cell_times.size() > 1 ) {
- cp += snprintf(cp,ep-cp, _("cell times:"));
- for( int i=0; i<cell_times.size(); ++i ) {
- if( (i%4) == 0 ) *cp++ = '\n';
- cp += snprintf(cp,ep-cp,_(" %3d. %8.3f"),i,cell_times.get(i));
- }
- cp += snprintf(cp,ep-cp, "\n");
- }
-
- int elements = mpeg3_dvb_channel_count(fd);
- if( elements <= 0 ) return;
- if( !mpeg3_dvb_get_system_time(fd, &sdate) ) {
- tm = (time_t)sdate;
- cp += snprintf(cp,ep-cp, _("\nsystem time: %s"), ctime_r(&tm,string));
- }
- cp += snprintf(cp,ep-cp, _("elements %d\n"), elements);
-
- for( int n=0; n<elements; ++n ) {
- char name[16], enc[8]; int vstream, astream;
- int major, minor, total_astreams, total_vstreams;
- if( mpeg3_dvb_get_channel(fd,n, &major, &minor) ||
- mpeg3_dvb_get_station_id(fd,n,&name[0]) ||
- mpeg3_dvb_total_vstreams(fd,n,&total_vstreams) ||
- mpeg3_dvb_total_astreams(fd,n,&total_astreams) ) continue;
- cp += snprintf(cp,ep-cp, " %3d.%-3d %s", major, minor, &name[0]);
- for( int vidx=0; vidx<total_vstreams; ++vidx ) {
- if( mpeg3_dvb_vstream_number(fd,n,vidx,&vstream) ) continue;
- if( vstream < 0 ) continue;
- cp += snprintf(cp,ep-cp, " v%d", vstream);
- }
- for( int aidx=0; aidx<total_astreams; ++aidx ) {
- if( mpeg3_dvb_astream_number(fd,n,aidx,&astream,&enc[0]) ) continue;
- if( astream < 0 ) continue;
- cp += snprintf(cp,ep-cp, " a%d %s", astream, &enc[0]);
- int atrack = 0;
- for(int i=0; i<astream; ++i )
- atrack += mpeg3_audio_channels(fd, i);
- int channels = mpeg3_audio_channels(fd, astream);
- cp += snprintf(cp,ep-cp, " trk %d-%d", atrack+1, atrack+channels);
- if( enc[0] ) cp += snprintf(cp,ep-cp," (%s)",enc);
- }
- cp += snprintf(cp,ep-cp, "\n");
- }
-
- for( int n=0; n<elements; ++n ) {
- int major, minor;
- if( mpeg3_dvb_get_channel(fd,n, &major, &minor) ) continue;
- cp += snprintf(cp,ep-cp, "\n**chan %3d.%-3d\n", major, minor);
- int len = mpeg3_dvb_get_chan_info(fd, n, -1, 0, cp, 1023);
- if( len < 0 ) len = snprintf(cp,ep-cp,_("no info"));
- cp += len; *cp++ = '*'; *cp++ = '*'; *cp++ = '\n';
- for( int ord=0; ord<0x80; ++ord ) {
- for( int i=0; (len=mpeg3_dvb_get_chan_info(fd,n,ord,i,cp,1023)) >= 0; ++i ) {
- char *bp = cp; cp += len;
- for( int k=2; --k>=0; ) { // skip 2 lines
- while( bp<cp && *bp++!='\n' );
- }
- for( char *lp=bp; bp<cp; ++bp ) { // add new lines
- if( *bp == '\n' || ((bp-lp)>=60 && *bp==' ') )
- *(lp=bp) = '\n';
- }
- *cp++ = '\n'; *cp = 0; // trailing new line
- }
- }
- }
-
- *cp = 0;
- mpeg3_close(fd);
- return;
-}
-
-int FileMPEG::get_audio_for_video(int vstream, int astream, int64_t &channel_mask)
-{
- channel_mask = 0;
- if( !fd ) return -1;
- int elements = mpeg3_dvb_channel_count(fd);
- if( elements <= 0 ) return -1;
-
- int pidx = -1;
- int total_astreams = 0, total_vstreams = 0;
- for( int n=0; pidx<0 && n<elements; ++n ) {
- total_astreams = total_vstreams = 0;
- if( mpeg3_dvb_total_vstreams(fd,n,&total_vstreams) ||
- mpeg3_dvb_total_astreams(fd,n,&total_astreams) ) continue;
- if( !total_vstreams || !total_astreams ) continue;
- for( int i=0; pidx<0 && i<total_vstreams; ++i ) {
- int vstrm = -1;
- if( mpeg3_dvb_vstream_number(fd,n,i,&vstrm) ) continue;
- if( vstrm == vstream ) pidx = n;
- }
- }
- if( pidx < 0 ) return -1;
- int ret = -1;
- int64_t channels = 0;
- for( int i=0; i<total_astreams; ++i ) {
- int astrm = -1;
- if( mpeg3_dvb_astream_number(fd,pidx,i,&astrm,0) ) continue;
- if( astrm < 0 ) continue;
- if( ret < 0 ) ret = astrm;
- if( astream > 0 ) { --astream; continue; }
- int atrack = 0;
- for(int i=0; i<astrm; ++i )
- atrack += mpeg3_audio_channels(fd, i);
- int64_t mask = (1 << mpeg3_audio_channels(fd, astrm)) - 1;
- channels |= mask << atrack;
- if( !astream ) break;
- }
- channel_mask = channels;
- return ret;
-}
-
-int FileMPEG::reset_parameters_derived()
-{
- wrote_header = 0;
- mjpeg_out = 0;
- mjpeg_eof = 0;
- mjpeg_error = 0;
- recd_fd = -1;
- fd = 0;
- video_out = 0;
- prev_track = 0;
- temp_frame = 0;
- twolame_temp = 0;
- twolame_out = 0;
- twolame_allocation = 0;
- twolame_result = 0;
- twofp = 0;
- twopts = 0;
- lame_temp[0] = 0;
- lame_temp[1] = 0;
- lame_allocation = 0;
- lame_global = 0;
- lame_output = 0;
- lame_output_allocation = 0;
- lame_fd = 0;
- lame_started = 0;
- return 0;
-}
-
-
-int FileMPEG::open_file(int rd, int wr)
-{
- int result = 0;
-
- if(rd) {
- char toc_name[BCTEXTLEN];
- result = file->preferences->get_asset_file_path(asset, toc_name);
- int error = 0;
- fd = mpeg3_open_title(asset->path, toc_name, &error);
- if( !fd ) {
- result = 1;
- if(error == zmpeg3_t::ERR_INVALID_TOC_VERSION) {
- eprintf(_("Couldn't open %s: invalid table of contents version.\n"
- "Rebuilding the table of contents."), asset->path);
- }
- else if(error == zmpeg3_t::ERR_TOC_DATE_MISMATCH) {
- eprintf(_("Couldn't open %s: table of contents out of date.\n"
- "Rebuilding the table of contents."), asset->path);
- }
- else {
- eprintf(_("Couldn't open %s: table of contents corrupt.\n"
- "Rebuilding the table of contents."), asset->path);
- }
- char filename[BCTEXTLEN];
- strcpy(filename, toc_name);
- char *sfx = strrchr(filename,'.');
- if( sfx && !strcmp(sfx+1,"toc") ) {
- remove(filename);
- strcpy(sfx+1,"idx");
- remove(filename);
- strcpy(toc_name, asset->path);
- fd = mpeg3_open_title(asset->path, toc_name, &error);
- if( fd ) result = 0;
- }
- if( result )
- eprintf(_("Couldn't open %s: rebuild failed.\n"), asset->path);
- }
- if(!result) {
-// Determine if the file needs a table of contents and create one if needed.
-// If it has video it must be scanned since video has keyframes.
- if(mpeg3_total_vstreams(fd) || mpeg3_total_astreams(fd)) {
- if(create_index()) return 1;
- }
-
-// more than 4 doesnt help much
- mpeg3_set_cpus(fd, file->cpus < 4 ? file->cpus : 4);
- file->current_program = mpeg3_set_program(fd, -1);
- if( asset->program < 0 )
- asset->program = file->current_program;
-
- asset->audio_data = mpeg3_has_audio(fd);
- if(asset->audio_data) {
- asset->channels = 0;
- for(int i = 0; i < mpeg3_total_astreams(fd); i++) {
- asset->channels += mpeg3_audio_channels(fd, i);
- }
- if(!asset->sample_rate)
- asset->sample_rate = mpeg3_sample_rate(fd, 0);
- asset->audio_length = mpeg3_audio_samples(fd, 0);
- if(!asset->channels ||
- !asset->sample_rate)
- result = 1;
- }
-
- asset->video_data = mpeg3_has_video(fd);
- if(asset->video_data) {
- if( !asset->layers ) {
- asset->layers = mpeg3_total_vstreams(fd);
- }
- asset->actual_width = mpeg3_video_width(fd, 0);
- if( !asset->width )
- asset->width = asset->actual_width;
- asset->actual_height = mpeg3_video_height(fd, 0);
- if( !asset->height )
- asset->height = asset->actual_height;
- if( !asset->video_length )
- asset->video_length = mpeg3_video_frames(fd, 0);
- if( !asset->vmpeg_cmodel )
- asset->vmpeg_cmodel = bc_colormodel(mpeg3_colormodel(fd, 0));
- if( !asset->frame_rate )
- asset->frame_rate = mpeg3_frame_rate(fd, 0);
- }
- }
- }
-
-
-
- if(!result && wr && asset->format == FILE_VMPEG)
- {
-// Heroine Virtual encoder
-// this one is cinelerra-x.x.x/mpeg2enc
- if(asset->vmpeg_cmodel == BC_YUV422P)
- {
- char bitrate_string[BCTEXTLEN];
- char quant_string[BCTEXTLEN];
- char iframe_string[BCTEXTLEN];
-
- sprintf(bitrate_string, "%d", asset->vmpeg_bitrate);
- sprintf(quant_string, "%d", asset->vmpeg_quantization);
- sprintf(iframe_string, "%d", asset->vmpeg_iframe_distance);
-
-// Construct command line
- if(!result)
- {
- char string[BCTEXTLEN];
- get_exe_path(string);
- sprintf(mjpeg_command, "%s/%s", string, HVPEG_EXE);
-
- if(asset->aspect_ratio > 0)
- {
- append_vcommand_line("-a");
-// Square pixels
- if(EQUIV((double)asset->width / asset->height,
- asset->aspect_ratio))
- append_vcommand_line("1");
- else
- if(EQUIV(asset->aspect_ratio, 1.333))
- append_vcommand_line("2");
- else
- if(EQUIV(asset->aspect_ratio, 1.777))
- append_vcommand_line("3");
- else
- if(EQUIV(asset->aspect_ratio, 2.11))
- append_vcommand_line("4");
- }
-
- append_vcommand_line(asset->vmpeg_derivative == 1 ? "-1" : "");
- append_vcommand_line(asset->vmpeg_cmodel == BC_YUV422P ? "-422" : "");
- if(asset->vmpeg_fix_bitrate)
- {
- append_vcommand_line("-b");
- append_vcommand_line(bitrate_string);
- }
- else
- {
- append_vcommand_line("-q");
- append_vcommand_line(quant_string);
- }
- append_vcommand_line("-n");
- append_vcommand_line(iframe_string);
- append_vcommand_line(asset->vmpeg_progressive ? "-p" : "");
- append_vcommand_line(asset->vmpeg_denoise ? "-d" : "");
- append_vcommand_line(file->cpus <= 1 ? "-u" : "");
- append_vcommand_line(asset->vmpeg_seq_codes ? "-g" : "");
- append_vcommand_line(asset->path);
-
- video_out = new FileMPEGVideo(this);
- video_out->start();
- }
- }
- else
-// mjpegtools encoder
-// this one is cinelerra-x.x.x/thirdparty/mjpegtools/mpeg2enc
- {
- char string[BCTEXTLEN];
- get_exe_path(string);
- sprintf(mjpeg_command, "%s/%s -v 0 ", string, MJPEG_EXE);
-
-// Must disable interlacing if MPEG-1
- switch (asset->vmpeg_preset)
- {
- case 0: asset->vmpeg_progressive = 1; break;
- case 1: asset->vmpeg_progressive = 1; break;
- case 2: asset->vmpeg_progressive = 1; break;
- }
-
-
-
-// The current usage of mpeg2enc requires bitrate of 0 when quantization is fixed and
-// quantization of 1 when bitrate is fixed. Perfectly intuitive.
- if(asset->vmpeg_fix_bitrate)
- {
- sprintf(string, " -b %d -q 1", asset->vmpeg_bitrate / 1000);
- }
- else
- {
- sprintf(string, " -b 0 -q %d", asset->vmpeg_quantization);
- }
- strcat(mjpeg_command, string);
-
-
-
-
-
-
-// Aspect ratio
- int aspect_ratio_code = -1;
- if(asset->aspect_ratio > 0)
- {
- int ncodes = sizeof(aspect_ratio_codes) / sizeof(double);
- for(int i = 1; i < ncodes; i++)
- {
- if(EQUIV(aspect_ratio_codes[i], asset->aspect_ratio))
- {
- aspect_ratio_code = i;
- break;
- }
- }
- }
-
-
-// Square pixels
- if(EQUIV((double)asset->width / asset->height, asset->aspect_ratio))
- aspect_ratio_code = 1;
-
- if(aspect_ratio_code < 0)
- {
- eprintf(_("Unsupported aspect ratio %f\n"), asset->aspect_ratio);
- aspect_ratio_code = 2;
- }
- sprintf(string, " -a %d", aspect_ratio_code);
- strcat(mjpeg_command, string);
-
-
-
-
-
-
-// Frame rate
- int frame_rate_code = -1;
- int ncodes = sizeof(frame_rate_codes) / sizeof(double);
- for(int i = 1; i < ncodes; ++i)
- {
- if(EQUIV(asset->frame_rate, frame_rate_codes[i]))
- {
- frame_rate_code = i;
- break;
- }
- }
- if(frame_rate_code < 0)
- {
- frame_rate_code = 4;
- eprintf(_("Unsupported frame rate %f\n"), asset->frame_rate);
- }
- sprintf(string, " -F %d", frame_rate_code);
- strcat(mjpeg_command, string);
-
-
-
-
-
- strcat(mjpeg_command,
- asset->vmpeg_progressive ? " -I 0" : " -I 1");
-
-
-
- sprintf(string, " -M %d", file->cpus);
- strcat(mjpeg_command, string);
-
-
- if(!asset->vmpeg_progressive)
- {
- strcat(mjpeg_command, asset->vmpeg_field_order ? " -z b" : " -z t");
- }
-
-
- sprintf(string, " -f %d", asset->vmpeg_preset);
- strcat(mjpeg_command, string);
-
-
- sprintf(string, " -g %d -G %d", asset->vmpeg_iframe_distance, asset->vmpeg_iframe_distance);
- strcat(mjpeg_command, string);
-
-
- if(asset->vmpeg_seq_codes) strcat(mjpeg_command, " -s");
-
-
- sprintf(string, " -R %d", CLAMP(asset->vmpeg_pframe_distance, 0, 2));
- strcat(mjpeg_command, string);
-
- sprintf(string, " -o '%s'", asset->path);
- strcat(mjpeg_command, string);
-
-
-
- printf("FileMPEG::open_file: Running %s\n", mjpeg_command);
- if(!(mjpeg_out = popen(mjpeg_command, "w")))
- {
- perror("FileMPEG::open_file");
- eprintf(_("Error while opening \"%s\" for writing\n%m\n"), mjpeg_command);
- return 1;
- }
-
- video_out = new FileMPEGVideo(this);
- video_out->start();
- }
- }
- else
- if(wr && asset->format == FILE_AMPEG)
- {
- //char encoder_string[BCTEXTLEN]; encoder_string[0] = 0;
-//printf("FileMPEG::open_file 1 %d\n", asset->ampeg_derivative);
-
- if(asset->ampeg_derivative == 2)
- {
- twofp = fopen(asset->path, "w" );
- if( !twofp ) return 1;
- twopts = twolame_init();
- int channels = asset->channels >= 2 ? 2 : 1;
- twolame_set_num_channels(twopts, channels);
- twolame_set_in_samplerate(twopts, asset->sample_rate);
- twolame_set_mode(twopts, channels >= 2 ?
- TWOLAME_JOINT_STEREO : TWOLAME_MONO);
- twolame_set_bitrate(twopts, asset->ampeg_bitrate);
- twolame_init_params(twopts);
- }
- else
- if(asset->ampeg_derivative == 3)
- {
- lame_global = lame_init();
-// lame_set_brate(lame_global, asset->ampeg_bitrate / 1000);
- lame_set_brate(lame_global, asset->ampeg_bitrate);
- lame_set_quality(lame_global, 0);
- lame_set_in_samplerate(lame_global,
- asset->sample_rate);
- lame_set_num_channels(lame_global,
- asset->channels);
- if((result = lame_init_params(lame_global)) < 0)
- {
- eprintf(_("encode: lame_init_params returned %d\n"), result);
- lame_close(lame_global);
- lame_global = 0;
- }
- else
- if(!(lame_fd = fopen(asset->path, "w")))
- {
- perror("FileMPEG::open_file");
- eprintf(_("Error while opening \"%s\" for writing\n%m\n"), asset->path);
- lame_close(lame_global);
- lame_global = 0;
- result = 1;
- }
- }
- else
- {
- eprintf(_("ampeg_derivative=%d\n"), asset->ampeg_derivative);
- result = 1;
- }
- }
-
-// Transport stream for DVB capture
- if(!result && !rd && !wr && asset->format == FILE_MPEG)
- {
- if( (recd_fd = open(asset->path, O_CREAT+O_TRUNC+O_WRONLY,
- S_IRUSR+S_IWUSR + S_IRGRP+S_IWGRP)) < 0 )
- {
- perror("FileMPEG::open_file");
- eprintf(_("Error while opening \"%s\" for writing\n%m\n"), asset->path);
- result = 1;
- }
- }
-
-
-//asset->dump();
- return result;
-}
-
-
-
-
-
-int FileMPEG::set_skimming(int track, int skim, skim_fn fn, void *vp)
-{
- return !fn ? mpeg3_set_thumbnail_callback(fd, track, 0, 0, 0, 0) :
- mpeg3_set_thumbnail_callback(fd, track, skim, 1, fn, vp);
-}
-
-int FileMPEG::skimming(void *vp, int track)
-{
- File *file = (File *)vp;
- FileMPEG *mpeg = (FileMPEG *)file->file;
- return mpeg->skim_result = mpeg->skim_callback(mpeg->skim_data, track);
-}
-
-int FileMPEG::skim_video(int track, void *vp, skim_fn fn)
-{
- skim_callback = fn; skim_data = vp;
- mpeg3_set_thumbnail_callback(fd, track, 1, 1, skimming, (void*)file);
- skim_result = -1;
- while( skim_result < 0 && !mpeg3_end_of_video(fd, track) )
- mpeg3_drop_frames(fd, 1, track);
- mpeg3_set_thumbnail_callback(fd, track, 0, 0, 0, 0);
- return skim_result;
-}
-
-
-
-int FileMPEG::toc_nail(void *vp, int track)
-{
- File *file = (File *)vp;
- FileMPEG *mpeg = (FileMPEG *)file->file;
- int64_t framenum; uint8_t *tdat; int mw, mh;
- if( mpeg->get_thumbnail(track, framenum, tdat, mw, mh) ) return 1;
- int pid, width, height; double framerate;
- if( mpeg->get_video_info(track, pid, framerate, width, height) ) return 1;
- if( pid < 0 || framerate <= 0 ) return 1;
- double position = framenum / framerate;
-//printf("t%d/%03x f"_LD", %dx%d %dx%d\n",track,pid,framenum,mw,mh,width,height);
- MWindow::commercials->get_frame(file, pid, position, tdat, mw, mh, width, height);
- return 0;
-}
-
-
-int FileMPEG::create_index()
-{
-// Calculate TOC path
- char index_filename[BCTEXTLEN];
- char source_filename[BCTEXTLEN];
-
- IndexFile::get_index_filename(source_filename,
- file->preferences->index_directory,
- index_filename,
- asset->path);
- char *ptr = strrchr(index_filename, '.');
- int error = 0;
-
- if(!ptr) return 1;
-
-// File is a table of contents.
- if(fd && mpeg3_has_toc(fd)) return 0;
-
- sprintf(ptr, ".toc");
-
- int need_toc = 1;
-
- if(fd) mpeg3_close(fd);
- fd = 0;
-
-// Test existing copy of TOC
- if((fd = mpeg3_open_title(asset->path, index_filename, &error)))
- need_toc = 0;
-
- if(need_toc)
- {
- int result = 0;
-// Create progress window.
-// This gets around the fact that MWindowGUI is locked.
- int64_t total_bytes = 0, last_bytes = -1;
- fd = mpeg3_start_toc( asset->path, index_filename,
- file->current_program, &total_bytes);
- if( !fd ) {
- eprintf(_("cant init toc index\n"));
- result = 1;
- }
-
- struct timeval new_time, prev_time, start_time, current_time;
- gettimeofday(&prev_time, 0); gettimeofday(&start_time, 0);
-
- if( !result && file->preferences->scan_commercials ) {
- set_skimming(-1, 1, toc_nail, file);
- if( (result=MWindow::commercials->resetDb() ) != 0 )
- eprintf(_("cant access commercials database"));
- }
-
- char progress_title[BCTEXTLEN]; progress_title[0] = 0;
- BC_ProgressBox *progress = 0;
- if( !result ) {
- sprintf(progress_title, _("Creating %s\n"), index_filename);
- progress = new BC_ProgressBox(-1, -1,
- progress_title, total_bytes);
- progress->start();
- }
-
- while( !result ) {
- int64_t bytes_processed = 0;
- if( mpeg3_do_toc(fd, &bytes_processed) ) break;
- gettimeofday(&new_time, 0);
-
- if(new_time.tv_sec - prev_time.tv_sec >= 1)
- {
- gettimeofday(¤t_time, 0);
- int64_t elapsed_seconds = current_time.tv_sec - start_time.tv_sec;
- int64_t total_seconds = !bytes_processed ? 0 :
- elapsed_seconds * total_bytes / bytes_processed;
- int64_t eta = total_seconds - elapsed_seconds;
- progress->update(bytes_processed, 1);
- char string[BCTEXTLEN];
- sprintf(string, "%sETA: " _LD "m" _LD "s",
- progress_title, eta / 60, eta % 60);
- progress->update_title(string, 1);
-// fprintf(stderr, "ETA: %dm%ds \r",
-// bytes_processed * 100 / total_bytes,
-// eta / 60, eta % 60);
-// fflush(stdout);
- prev_time = new_time;
- }
- if(bytes_processed >= total_bytes) break;
- if(progress->is_cancelled()) result = 1;
- if( bytes_processed == last_bytes ) {
- eprintf(_("toc scan stopped before eof"));
- break;
- }
- last_bytes = bytes_processed;
- }
-
- // record scan results
- if( file->preferences->scan_commercials ) {
- if( !result ) MWindow::commercials->write_ads(asset->path);
- MWindow::commercials->closeDb();
- }
-
- if( fd ) { mpeg3_stop_toc(fd); fd = 0; }
- if( progress ) { progress->stop_progress(); delete progress; }
- if( result ) { remove_file(index_filename); return 1; }
- }
-
-
-
-// Reopen file from index path instead of asset path.
- if(!fd)
- {
- if(!(fd = mpeg3_open(index_filename, &error)))
- {
- return 1;
- }
- }
-
- return 0;
-}
-
-
-
-
-
-
-void FileMPEG::append_vcommand_line(const char *string)
-{
- if(string[0])
- {
- char *argv = cstrdup(string);
- vcommand_line.append(argv);
- }
-}
-
-int FileMPEG::close_file()
-{
- mjpeg_eof = 1;
- next_frame_lock->unlock();
-
- if(fd)
- {
- mpeg3_close(fd);
- }
-
- if(video_out)
- {
-// End of sequence signal
- if(file->asset->vmpeg_cmodel == BC_YUV422P)
- {
- mpeg2enc_set_input_buffers(1, 0, 0, 0);
- }
- delete video_out;
- video_out = 0;
- }
-
- vcommand_line.remove_all_objects();
-
- if(twofp) {
- unsigned char opkt[1152*2];
- int ret = twolame_encode_flush(twopts, opkt, sizeof(opkt));
- if( ret > 0 )
- fwrite(opkt, 1, ret, twofp);
- else if( ret < 0 )
- fprintf(stderr, _("twolame error encoding audio: %d\n"), ret);
- fclose(twofp); twofp = 0;
- }
- if( twopts ) { twolame_close(&twopts); twopts = 0; }
-
- if(lame_global)
- lame_close(lame_global);
-
- if(temp_frame) delete temp_frame;
- if(twolame_temp) delete [] twolame_temp;
-
- if(lame_temp[0]) delete [] lame_temp[0];
- if(lame_temp[1]) delete [] lame_temp[1];
- if(lame_output) delete [] lame_output;
- if(lame_fd) fclose(lame_fd);
-
- if(mjpeg_out) pclose(mjpeg_out);
-
- if( recd_fd >= 0 ) {
- close(recd_fd);
- recd_fd = -1;
- }
-
- reset_parameters();
-
- FileBase::close_file();
- return 0;
-}
-
-int FileMPEG::get_best_colormodel(Asset *asset, int driver)
-{
-//printf("FileMPEG::get_best_colormodel 1\n");
- switch(driver)
- {
- case PLAYBACK_X11:
- return BC_RGB888;
- case PLAYBACK_X11_XV:
- case PLAYBACK_ASYNCHRONOUS:
- return zmpeg3_cmdl(asset->vmpeg_cmodel) > 0 ?
- asset->vmpeg_cmodel : BC_RGB888;
- case PLAYBACK_X11_GL:
- return BC_YUV888;
- case PLAYBACK_LML:
- case PLAYBACK_BUZ:
- return BC_YUV422P;
- case PLAYBACK_DV1394:
- case PLAYBACK_FIREWIRE:
- return BC_YUV422P;
- case VIDEO4LINUX:
- case VIDEO4LINUX2:
- return zmpeg3_cmdl(asset->vmpeg_cmodel) > 0 ?
- asset->vmpeg_cmodel : BC_RGB888;
- case VIDEO4LINUX2JPEG:
- return BC_COMPRESSED;
- case CAPTURE_DVB:
- case VIDEO4LINUX2MPEG:
- return BC_YUV422P;
- case CAPTURE_JPEG_WEBCAM:
- return BC_COMPRESSED;
- case CAPTURE_YUYV_WEBCAM:
- return BC_YUV422;
- case CAPTURE_BUZ:
- case CAPTURE_LML:
- return BC_YUV422;
- case CAPTURE_FIREWIRE:
- case CAPTURE_IEC61883:
- return BC_YUV422P;
- }
- eprintf(_("unknown driver %d\n"),driver);
- return BC_RGB888;
-}
-
-int FileMPEG::colormodel_supported(int colormodel)
-{
- return colormodel;
-}
-
-int FileMPEG::get_index(char *index_path)
-{
- if(!fd) return 1;
-
-
-// Convert the index tables from tracks to channels.
- if(mpeg3_index_tracks(fd)) {
- IndexState *index_state = asset->index_state;
- int index_zoom = mpeg3_index_zoom(fd);
- int ntracks = mpeg3_index_tracks(fd);
- int64_t offset = 0;
- for(int i = 0; i < ntracks; i++) {
- int nch = mpeg3_index_channels(fd, i);
- for(int j = 0; j < nch; j++) {
- float *bfr = (float *)mpeg3_index_data(fd, i, j);
- int64_t size = 2*mpeg3_index_size(fd, i);
- index_state->add_index_entry(bfr, offset, size);
- offset += size;
- }
- }
- FileSystem fs;
- int64_t file_bytes = fs.get_size(asset->path);
- return index_state->write_index(index_path, asset, index_zoom, file_bytes);
- }
-
- return 1;
-}
-
-
-int FileMPEG::can_copy_from(Asset *asset, int64_t position)
-{
- if(!fd) return 0;
- return 0;
-}
-
-int FileMPEG::set_audio_position(int64_t sample)
-{
-#if 0
- if(!fd) return 1;
-
- int channel, stream;
- to_streamchannel(file->current_channel, stream, channel);
-
-//printf("FileMPEG::set_audio_position %d %d %d\n", sample, mpeg3_get_sample(fd, stream), last_sample);
- if(sample != mpeg3_get_sample(fd, stream) &&
- sample != last_sample)
- {
- if(sample >= 0 && sample < asset->audio_length)
- {
-//printf("FileMPEG::set_audio_position seeking stream %d\n", sample);
- return mpeg3_set_sample(fd, sample, stream);
- }
- else
- return 1;
- }
-#endif
- return 0;
-}
-
-int FileMPEG::set_video_position(int64_t pos)
-{
- if( !fd || pos < 0 || pos >= asset->video_length )
- return 1;
-//printf("FileMPEG::set_video_position 1 " _LD "\n", x);
- mpeg3_set_frame(fd, pos, file->current_layer);
- return 0;
-}
-
-int64_t FileMPEG::get_memory_usage()
-{
- int64_t result = file->rd && fd ? mpeg3_memory_usage(fd) : 0;
-//printf("FileMPEG::get_memory_usage %d " _LD "\n", __LINE__, result);
- return result;
-}
-
-int FileMPEG::set_program(int no)
-{
- return fd ? mpeg3_set_program(fd, no) : -1;
-}
-
-int FileMPEG::get_cell_time(int no, double &time)
-{
- return fd ? mpeg3_get_cell_time(fd, no, &time) : -1;
-}
-
-int FileMPEG::get_system_time(int64_t &tm)
-{
- return fd ? mpeg3_dvb_get_system_time(fd, &tm) : -1;
-}
-
-int FileMPEG::get_video_pid(int track)
-{
- return fd ? mpeg3_video_pid(fd, track) : -1;
-}
-
-int FileMPEG::get_video_info(int track, int &pid,
- double &framerate, int &width, int &height, char *title)
-{
- if( !fd ) return -1;
- pid = mpeg3_video_pid(fd, track);
- framerate = mpeg3_frame_rate(fd, track);
- width = mpeg3_video_width(fd, track);
- height = mpeg3_video_height(fd, track);
- if( !title ) return 0;
- *title = 0;
-
- int elements = mpeg3_dvb_channel_count(fd);
- for( int n=0; n<elements; ++n ) {
- int major, minor, total_vstreams, vstream, vidx;
- if( mpeg3_dvb_get_channel(fd,n, &major, &minor) ||
- mpeg3_dvb_total_vstreams(fd,n,&total_vstreams) ) continue;
- for( vidx=0; vidx<total_vstreams; ++vidx ) {
- if( mpeg3_dvb_vstream_number(fd,n,vidx,&vstream) ) continue;
- if( vstream < 0 ) continue;
- if( vstream == track ) {
- sprintf(title, "%3d.%-3d", major, minor);
- return 0;
- }
- }
- }
- return 0;
-}
-
-int FileMPEG::select_video_stream(Asset *asset, int vstream)
-{
- if( !fd ) return -1;
- asset->width = mpeg3_video_width(fd, vstream);
- asset->height = mpeg3_video_height(fd, vstream);
- asset->video_length = mpeg3_video_frames(fd, vstream);
- asset->frame_rate = mpeg3_frame_rate(fd, vstream);
- return 0;
-}
-
-int FileMPEG::select_audio_stream(Asset *asset, int astream)
-{
- if( !fd ) return -1;
- asset->sample_rate = mpeg3_sample_rate(fd, astream);
- asset->audio_length = mpeg3_audio_samples(fd, astream);
- return 0;
-}
-
-int FileMPEG::get_thumbnail(int stream,
- int64_t &position, unsigned char *&thumbnail, int &ww, int &hh)
-{
- return !fd ? -1 :
- mpeg3_get_thumbnail(fd, stream, &position, &thumbnail, &ww, &hh);
-}
-
-int FileMPEG::write_samples(double **buffer, int64_t len)
-{
- int result = 0;
-
-//printf("FileMPEG::write_samples 1\n");
- if(asset->ampeg_derivative == 2) {
-// Convert to int16
- int channels = MIN(asset->channels, 2);
- int64_t audio_size = len * channels * 2;
- if(twolame_allocation < audio_size) {
- if(twolame_temp) delete [] twolame_temp;
- twolame_temp = new unsigned char[audio_size];
- twolame_allocation = audio_size;
- if(twolame_out) delete [] twolame_out;
- twolame_out = new unsigned char[audio_size + 1152];
- }
-
- for(int i = 0; i < channels; i++) {
- int16_t *output = ((int16_t*)twolame_temp) + i;
- double *input = buffer[i];
- for(int j = 0; j < len; j++) {
- int sample = (int)(*input * 0x7fff);
- *output = (int16_t)(CLIP(sample, -0x8000, 0x7fff));
- output += channels;
- input++;
- }
- }
- int ret = twolame_encode_buffer_interleaved(twopts,
- (int16_t*)twolame_temp, len,
- twolame_out, twolame_allocation+1152);
- if( ret > 0 )
- fwrite(twolame_out, 1, ret, twofp);
- else if( ret < 0 )
- fprintf(stderr, _("twolame error encoding audio: %d\n"), ret);
- }
- else
- if(asset->ampeg_derivative == 3)
- {
- int channels = MIN(asset->channels, 2);
- int64_t audio_size = len * channels;
- if(!lame_global) return 1;
- if(!lame_fd) return 1;
- if(lame_allocation < audio_size)
- {
- if(lame_temp[0]) delete [] lame_temp[0];
- if(lame_temp[1]) delete [] lame_temp[1];
- lame_temp[0] = new float[audio_size];
- lame_temp[1] = new float[audio_size];
- lame_allocation = audio_size;
- }
-
- if(lame_output_allocation < audio_size * 4)
- {
- if(lame_output) delete [] lame_output;
- lame_output_allocation = audio_size * 4;
- lame_output = new char[lame_output_allocation];
- }
-
- for(int i = 0; i < channels; i++)
- {
- float *output = lame_temp[i];
- double *input = buffer[i];
- for(int j = 0; j < len; j++)
- {
- *output++ = *input++ * (float)32768;
- }
- }
-
- result = lame_encode_buffer_float(lame_global,
- lame_temp[0],
- (channels > 1) ? lame_temp[1] : lame_temp[0],
- len,
- (unsigned char*)lame_output,
- lame_output_allocation);
- if(result > 0)
- {
- char *real_output = lame_output;
- int bytes = result;
- if(!lame_started)
- {
- for(int i = 0; i < bytes; i++)
- if(lame_output[i])
- {
- real_output = &lame_output[i];
- lame_started = 1;
- bytes -= i;
- break;
- }
- }
- if(bytes > 0 && lame_started)
- {
- result = !fwrite(real_output, 1, bytes, lame_fd);
- if(result) {
- perror("FileMPEG::write_samples");
- eprintf(_("write failed: %m"));
- }
- }
- else
- result = 0;
- }
- else
- result = 1;
- }
-
- return result;
-}
-
-int FileMPEG::write_frames(VFrame ***frames, int len)
-{
- int result = 0;
-
- if(video_out)
- {
- int temp_w = (int)((asset->width + 15) / 16) * 16;
- int temp_h;
-
- int output_cmodel = asset->vmpeg_cmodel;
-// verify colormodel supported in MPEG output
- switch( output_cmodel ) {
- case BC_YUV420P:
- case BC_YUV422P:
- break;
- default:
- return 1;
- }
-
-// Height depends on progressiveness
- if(asset->vmpeg_progressive || asset->vmpeg_derivative == 1)
- temp_h = (int)((asset->height + 15) / 16) * 16;
- else
- temp_h = (int)((asset->height + 31) / 32) * 32;
-
-//printf("FileMPEG::write_frames 1\n");
-
-// Only 1 layer is supported in MPEG output
- for(int i = 0; i < 1; i++)
- {
- for(int j = 0; j < len && !result; j++)
- {
- VFrame *frame = frames[i][j];
-
-
-
- if(asset->vmpeg_cmodel == BC_YUV422P)
- {
- if(frame->get_w() == temp_w &&
- frame->get_h() == temp_h &&
- frame->get_color_model() == output_cmodel)
- {
- mpeg2enc_set_input_buffers(0,
- (char*)frame->get_y(),
- (char*)frame->get_u(),
- (char*)frame->get_v());
- }
- else
- {
- if(temp_frame &&
- (temp_frame->get_w() != temp_w ||
- temp_frame->get_h() != temp_h ||
- temp_frame->get_color_model() || output_cmodel))
- {
- delete temp_frame;
- temp_frame = 0;
- }
-
-
- if(!temp_frame)
- {
- temp_frame = new VFrame(0,
- -1,
- temp_w,
- temp_h,
- output_cmodel,
- -1);
- }
-
- BC_CModels::transfer(temp_frame->get_rows(),
- frame->get_rows(),
- temp_frame->get_y(),
- temp_frame->get_u(),
- temp_frame->get_v(),
- frame->get_y(),
- frame->get_u(),
- frame->get_v(),
- 0,
- 0,
- frame->get_w(),
- frame->get_h(),
- 0,
- 0,
- temp_frame->get_w(),
- temp_frame->get_h(),
- frame->get_color_model(),
- temp_frame->get_color_model(),
- 0,
- frame->get_w(),
- temp_frame->get_w());
-
- mpeg2enc_set_input_buffers(0,
- (char*)temp_frame->get_y(),
- (char*)temp_frame->get_u(),
- (char*)temp_frame->get_v());
- }
- }
- else
- {
-// MJPEG uses the same dimensions as the input
-//printf("FileMPEG::write_frames %d\n", __LINE__);sleep(1);
- if(frame->get_color_model() == output_cmodel)
- {
- mjpeg_y = frame->get_y();
- mjpeg_u = frame->get_u();
- mjpeg_v = frame->get_v();
- }
- else
- {
-//printf("FileMPEG::write_frames %d\n", __LINE__);sleep(1);
- if(!temp_frame)
- {
- temp_frame = new VFrame(0,
- -1,
- asset->width,
- asset->height,
- output_cmodel,
- -1);
- }
-
-// printf("FileMPEG::write_frames %d temp_frame=%p %p %p %p frame=%p %p %p %p color_model=%p %p\n",
-// __LINE__,
-// temp_frame,
-// temp_frame->get_w(),
-// temp_frame->get_h(),
-// frame,
-// frame->get_w(),
-// frame->get_h(),
-// temp_frame->get_color_model(),
-// frame->get_color_model()); sleep(1);
- BC_CModels::transfer(temp_frame->get_rows(),
- frame->get_rows(),
- temp_frame->get_y(),
- temp_frame->get_u(),
- temp_frame->get_v(),
- frame->get_y(),
- frame->get_u(),
- frame->get_v(),
- 0,
- 0,
- frame->get_w(),
- frame->get_h(),
- 0,
- 0,
- temp_frame->get_w(),
- temp_frame->get_h(),
- frame->get_color_model(),
- temp_frame->get_color_model(),
- 0,
- frame->get_w(),
- temp_frame->get_w());
-//printf("FileMPEG::write_frames %d\n", __LINE__);sleep(1);
-
- mjpeg_y = temp_frame->get_y();
- mjpeg_u = temp_frame->get_u();
- mjpeg_v = temp_frame->get_v();
- }
-
-
-
-
- next_frame_lock->unlock();
- next_frame_done->lock("FileMPEG::write_frames");
- if(mjpeg_error) result = 1;
- }
-
-
-
-
-
- }
- }
- }
-
-
-
- return result;
-}
-
-int FileMPEG::zmpeg3_cmdl(int colormodel)
-{
- switch( colormodel ) {
- case BC_BGR888: return zmpeg3_t::cmdl_BGR888;
- case BC_BGR8888: return zmpeg3_t::cmdl_BGRA8888;
- case BC_RGB565: return zmpeg3_t::cmdl_RGB565;
- case BC_RGB888: return zmpeg3_t::cmdl_RGB888;
- case BC_RGBA8888: return zmpeg3_t::cmdl_RGBA8888;
- case BC_RGBA16161616: return zmpeg3_t::cmdl_RGBA16161616;
- case BC_YUV420P: return zmpeg3_t::cmdl_YUV420P;
- case BC_YUV422P: return zmpeg3_t::cmdl_YUV422P;
- case BC_YUV422: return zmpeg3_t::cmdl_YUYV;
- case BC_YUV888: return zmpeg3_t::cmdl_YUV888;
- case BC_YUVA8888: return zmpeg3_t::cmdl_YUVA8888;
- }
- return -1;
-}
-
-int FileMPEG::bc_colormodel(int cmdl)
-{
- switch( cmdl ) {
- case zmpeg3_t::cmdl_BGR888: return BC_BGR888;
- case zmpeg3_t::cmdl_BGRA8888: return BC_BGR8888;
- case zmpeg3_t::cmdl_RGB565: return BC_RGB565;
- case zmpeg3_t::cmdl_RGB888: return BC_RGB888;
- case zmpeg3_t::cmdl_RGBA8888: return BC_RGBA8888;
- case zmpeg3_t::cmdl_RGBA16161616: return BC_RGBA16161616;
- case zmpeg3_t::cmdl_YUV420P: return BC_YUV420P;
- case zmpeg3_t::cmdl_YUV422P: return BC_YUV422P;
- case zmpeg3_t::cmdl_YUYV: return BC_YUV422;
- case zmpeg3_t::cmdl_YUV888: return BC_YUV888;
- case zmpeg3_t::cmdl_YUVA8888: return BC_YUVA8888;
- }
- return -1;
-}
-
-const char *FileMPEG::zmpeg3_cmdl_name(int cmdl)
-{
-# define CMDL(nm) #nm
- static const char *cmdl_name[] = {
- CMDL(BGR888),
- CMDL(BGRA8888),
- CMDL(RGB565),
- CMDL(RGB888),
- CMDL(RGBA8888),
- CMDL(RGBA16161616),
- CMDL(UNKNOWN),
- CMDL(601_BGR888),
- CMDL(601_BGRA8888),
- CMDL(601_RGB888),
- CMDL(601_RGBA8888),
- CMDL(601_RGB565),
- CMDL(YUV420P),
- CMDL(YUV422P),
- CMDL(601_YUV420P),
- CMDL(601_YUV422P),
- CMDL(UYVY),
- CMDL(YUYV),
- CMDL(601_UYVY),
- CMDL(601_YUYV),
- CMDL(YUV888),
- CMDL(YUVA8888),
- CMDL(601_YUV888),
- CMDL(601_YUVA8888),
- };
- return cmdl>=0 && cmdl<lengthof(cmdl_name) ? cmdl_name[cmdl] : cmdl_name[6];
-}
-
-
-int FileMPEG::read_frame(VFrame *frame)
-{
- if(!fd) return 1;
- int result = 0;
- int width = mpeg3_video_width(fd,file->current_layer);
- int height = mpeg3_video_height(fd,file->current_layer);
- int stream_cmdl = mpeg3_colormodel(fd,file->current_layer);
- int stream_color_model = bc_colormodel(stream_cmdl);
- int frame_color_model = frame->get_color_model();
- int frame_cmdl = zmpeg3_cmdl(frame_color_model);
- mpeg3_show_subtitle(fd, file->current_layer, file->playback_subtitle);
-
-
- switch( frame_color_model ) { // check for direct copy
- case BC_YUV420P:
- case BC_YUV422P:
- if( stream_color_model == frame_color_model &&
- width == frame->get_w() && height == frame->get_h() ) {
- mpeg3_read_yuvframe(fd,
- (char*)frame->get_y(),
- (char*)frame->get_u(),
- (char*)frame->get_v(),
- 0, 0, width, height,
- file->current_layer);
- return result;
- }
- }
-
- if( frame_cmdl >= 0 ) { // supported by read_frame
- // cant rely on frame->get_rows(), format may not support it
- int uvs = 0;
- switch( frame_color_model ) {
- case BC_YUV420P: uvs = 2; break;
- case BC_YUV422P: uvs = 1; break;
- }
- //int w = frame->get_w();
- int h = frame->get_h();
- int bpl = frame->get_bytes_per_line();
- int uvw = !uvs ? 0 : bpl / 2;
- int uvh = !uvs ? 0 : h / uvs;
- uint8_t *rows[h + 2*uvh], *rp;
- int n = 0;
- if( (rp=frame->get_y()) ) {
- for( int i=0; i<h; ++i, rp+=bpl ) rows[n++] = rp;
- rp = frame->get_u();
- for( int i=0; i<uvh; ++i, rp+=uvw ) rows[n++] = rp;
- rp = frame->get_v();
- for( int i=0; i<uvh; ++i, rp+=uvw ) rows[n++] = rp;
- }
- else {
- rp = frame->get_data(); uvh *= 2;
- for( int i=0; i<h; ++i, rp+=bpl ) rows[n++] = rp;
- for( int i=0; i<uvh; ++i, rp+=uvw ) rows[n++] = rp;
- }
-
- mpeg3_read_frame(fd,
- rows, /* start of each output row */
- 0, 0, width, height, /* input box */
- frame->get_w(), /* Dimensions of output_rows */
- frame->get_h(),
- frame_cmdl,
- file->current_layer);
- return result;
- }
-
- char *y, *u, *v;
- mpeg3_read_yuvframe_ptr(fd, &y, &u, &v, file->current_layer);
- if( y && u && v ) {
- BC_CModels::transfer(frame->get_rows(), 0,
- frame->get_y(),
- frame->get_u(),
- frame->get_v(),
- (unsigned char*)y,
- (unsigned char*)u,
- (unsigned char*)v,
- 0, 0, width, height,
- 0, 0, frame->get_w(), frame->get_h(),
- stream_color_model,
- frame_color_model,
- 0,
- width,
- frame->get_w());
- }
-
- return result;
-}
-
-
-void FileMPEG::to_streamchannel(int channel, int &stream_out, int &channel_out)
-{
- int total_astreams = mpeg3_total_astreams(fd);
- for(stream_out = 0; stream_out < total_astreams; ++stream_out )
- {
- int stream_channels = mpeg3_audio_channels(fd, stream_out);
- if( channel < stream_channels ) break;
- channel -= stream_channels;
- }
- channel_out = channel;
-}
-
-int FileMPEG::read_samples(double *buffer, int64_t len)
-{
- if(!fd) return 0;
- if(len < 0) return 0;
-
-// Translate pure channel to a stream and a channel in the mpeg stream
- int stream, channel;
- to_streamchannel(file->current_channel, stream, channel);
-
-//printf("FileMPEG::read_samples 1 current_sample=" _LD " len=" _LD " channel=%d\n", file->current_sample, len, channel);
-
- mpeg3_set_sample(fd,
- file->current_sample,
- stream);
- mpeg3_read_audio_d(fd,
- buffer, /* Pointer to pre-allocated buffer of doubles */
- channel, /* Channel to decode */
- len, /* Number of samples to decode */
- stream); /* Stream containing the channel */
-
-// last_sample = file->current_sample;
- return 0;
-}
-
-
-
-
-
-
-FileMPEGVideo::FileMPEGVideo(FileMPEG *file)
- : Thread(1, 0, 0)
-{
- this->file = file;
-
-
- if(file->asset->vmpeg_cmodel == BC_YUV422P)
- {
- mpeg2enc_init_buffers();
- mpeg2enc_set_w(file->asset->width);
- mpeg2enc_set_h(file->asset->height);
- mpeg2enc_set_rate(file->asset->frame_rate);
- }
-}
-
-FileMPEGVideo::~FileMPEGVideo()
-{
- Thread::join();
-}
-
-void FileMPEGVideo::run()
-{
- if(file->asset->vmpeg_cmodel == BC_YUV422P)
- {
- printf("FileMPEGVideo::run ");
- for(int i = 0; i < file->vcommand_line.total; i++)
- printf("%s ", file->vcommand_line.values[i]);
- printf("\n");
- mpeg2enc(file->vcommand_line.total, file->vcommand_line.values);
- }
- else
- {
- while(1)
- {
-//printf("FileMPEGVideo::run %d\n", __LINE__);
- file->next_frame_lock->lock("FileMPEGVideo::run");
-//printf("FileMPEGVideo::run %d\n", __LINE__);
- if(file->mjpeg_eof)
- {
- file->next_frame_done->unlock();
- break;
- }
-
-
-
-//printf("FileMPEGVideo::run %d\n", __LINE__);
-// YUV4 sequence header
- if(!file->wrote_header)
- {
- file->wrote_header = 1;
-
- char interlace_string[BCTEXTLEN];
- if(!file->asset->vmpeg_progressive)
- {
- sprintf(interlace_string, file->asset->vmpeg_field_order ? "b" : "t");
- }
- else
- {
- sprintf(interlace_string, "p");
- }
- double aspect_ratio = file->asset->aspect_ratio >= 0 ?
- file->asset->aspect_ratio : 1.0;
-//printf("FileMPEGVideo::run %d\n", __LINE__);
- fprintf(file->mjpeg_out, "YUV4MPEG2 W%d H%d F%d:%d I%s A%d:%d C%s\n",
- file->asset->width, file->asset->height,
- (int)(file->asset->frame_rate * 1001),
- 1001, interlace_string,
- (int)(aspect_ratio * 1000), 1000,
- "420mpeg2");
-//printf("FileMPEGVideo::run %d\n", __LINE__);
- }
-
-// YUV4 frame header
-//printf("FileMPEGVideo::run %d\n", __LINE__);
- fprintf(file->mjpeg_out, "FRAME\n");
-
-// YUV data
-//printf("FileMPEGVideo::run %d\n", __LINE__);
- if(!fwrite(file->mjpeg_y, file->asset->width * file->asset->height, 1, file->mjpeg_out))
- file->mjpeg_error = 1;
-//printf("FileMPEGVideo::run %d\n", __LINE__);
- if(!fwrite(file->mjpeg_u, file->asset->width * file->asset->height / 4, 1, file->mjpeg_out))
- file->mjpeg_error = 1;
-//printf("FileMPEGVideo::run %d\n", __LINE__);
- if(!fwrite(file->mjpeg_v, file->asset->width * file->asset->height / 4, 1, file->mjpeg_out))
- file->mjpeg_error = 1;
-//printf("FileMPEGVideo::run %d\n", __LINE__);
- fflush(file->mjpeg_out);
-
-//printf("FileMPEGVideo::run %d\n", __LINE__);
- file->next_frame_done->unlock();
-//printf("FileMPEGVideo::run %d\n", __LINE__);
- }
- pclose(file->mjpeg_out);
- file->mjpeg_out = 0;
- }
-}
-
-
-
-
-
-
-
-
-
-
-
-
-MPEGConfigAudio::MPEGConfigAudio(BC_WindowBase *parent_window, Asset *asset)
- : BC_Window(_(PROGRAM_NAME ": Audio Compression"),
- parent_window->get_abs_cursor_x(1),
- parent_window->get_abs_cursor_y(1),
- 310,
- 120,
- -1,
- -1,
- 0,
- 0,
- 1)
-{
- this->parent_window = parent_window;
- this->asset = asset;
-}
-
-MPEGConfigAudio::~MPEGConfigAudio()
-{
-}
-
-void MPEGConfigAudio::create_objects()
-{
- int x = 10, y = 10;
- int x1 = 150;
- MPEGLayer *layer;
-
- lock_window("MPEGConfigAudio::create_objects");
- if(asset->format == FILE_MPEG)
- {
- add_subwindow(new BC_Title(x, y, _("No options for MPEG transport stream.")));
- unlock_window();
- return;
- }
-
-
- add_tool(new BC_Title(x, y, _("Layer:")));
- add_tool(layer = new MPEGLayer(x1, y, this));
- layer->create_objects();
-
- y += 30;
- add_tool(new BC_Title(x, y, _("Kbits per second:")));
- add_tool(bitrate = new MPEGABitrate(x1, y, this));
- bitrate->create_objects();
-
-
- add_subwindow(new BC_OKButton(this));
- show_window(1);
- unlock_window();
-}
-
-int MPEGConfigAudio::close_event()
-{
- set_done(0);
- return 1;
-}
-
-
-
-
-
-
-
-MPEGLayer::MPEGLayer(int x, int y, MPEGConfigAudio *gui)
- : BC_PopupMenu(x, y, 100, layer_to_string(gui->asset->ampeg_derivative))
-{
- this->gui = gui;
-}
-
-void MPEGLayer::create_objects()
-{
- add_item(new BC_MenuItem(layer_to_string(2)));
- add_item(new BC_MenuItem(layer_to_string(3)));
-}
-
-int MPEGLayer::handle_event()
-{
- gui->asset->ampeg_derivative = string_to_layer(get_text());
- gui->bitrate->set_layer(gui->asset->ampeg_derivative);
- return 1;
-};
-
-int MPEGLayer::string_to_layer(char *string)
-{
- if(!strcasecmp(layer_to_string(2), string))
- return 2;
- if(!strcasecmp(layer_to_string(3), string))
- return 3;
-
- return 2;
-}
-
-char* MPEGLayer::layer_to_string(int layer)
-{
- switch(layer)
- {
- case 2:
- return _("II");
- break;
-
- case 3:
- return _("III");
- break;
-
- default:
- return _("II");
- break;
- }
-}
-
-
-
-
-
-
-
-MPEGABitrate::MPEGABitrate(int x, int y, MPEGConfigAudio *gui)
- : BC_PopupMenu(x,
- y,
- 100,
- bitrate_to_string(gui->string, gui->asset->ampeg_bitrate))
-{
- this->gui = gui;
-}
-
-void MPEGABitrate::create_objects()
-{
- set_layer(gui->asset->ampeg_derivative);
-}
-
-void MPEGABitrate::set_layer(int layer)
-{
- while(total_items())
- {
- remove_item(0);
- }
-
- if(layer == 2)
- {
- add_item(new BC_MenuItem("160"));
- add_item(new BC_MenuItem("192"));
- add_item(new BC_MenuItem("224"));
- add_item(new BC_MenuItem("256"));
- add_item(new BC_MenuItem("320"));
- add_item(new BC_MenuItem("384"));
- }
- else
- {
- add_item(new BC_MenuItem("8"));
- add_item(new BC_MenuItem("16"));
- add_item(new BC_MenuItem("24"));
- add_item(new BC_MenuItem("32"));
- add_item(new BC_MenuItem("40"));
- add_item(new BC_MenuItem("48"));
- add_item(new BC_MenuItem("56"));
- add_item(new BC_MenuItem("64"));
- add_item(new BC_MenuItem("80"));
- add_item(new BC_MenuItem("96"));
- add_item(new BC_MenuItem("112"));
- add_item(new BC_MenuItem("128"));
- add_item(new BC_MenuItem("144"));
- add_item(new BC_MenuItem("160"));
- add_item(new BC_MenuItem("192"));
- add_item(new BC_MenuItem("224"));
- add_item(new BC_MenuItem("256"));
- add_item(new BC_MenuItem("320"));
- }
-}
-
-int MPEGABitrate::handle_event()
-{
- gui->asset->ampeg_bitrate = string_to_bitrate(get_text());
- return 1;
-};
-
-int MPEGABitrate::string_to_bitrate(char *string)
-{
- return atol(string);
-}
-
-
-char* MPEGABitrate::bitrate_to_string(char *string, int bitrate)
-{
- sprintf(string, "%d", bitrate);
- return string;
-}
-
-
-
-
-
-
-
-
-
-MPEGConfigVideo::MPEGConfigVideo(BC_WindowBase *parent_window,
- Asset *asset)
- : BC_Window(_(PROGRAM_NAME ": Video Compression"),
- parent_window->get_abs_cursor_x(1),
- parent_window->get_abs_cursor_y(1),
- 500,
- 400,
- -1,
- -1,
- 0,
- 0,
- 1)
-{
- this->parent_window = parent_window;
- this->asset = asset;
- reset_cmodel();
-}
-
-MPEGConfigVideo::~MPEGConfigVideo()
-{
-}
-
-void MPEGConfigVideo::create_objects()
-{
- int x = 10, y = 10;
- int x1 = x + 150;
- //int x2 = x + 300;
-
- lock_window("MPEGConfigVideo::create_objects");
- if(asset->format == FILE_MPEG)
- {
- add_subwindow(new BC_Title(x, y, _("No options for MPEG transport stream.")));
- unlock_window();
- return;
- }
-
- add_subwindow(new BC_Title(x, y, _("Color model:")));
- add_subwindow(cmodel = new MPEGColorModel(x1, y, this));
- cmodel->create_objects();
- y += 30;
-
- update_cmodel_objs();
-
- add_subwindow(new BC_OKButton(this));
- show_window(1);
- unlock_window();
-}
-
-int MPEGConfigVideo::close_event()
-{
- set_done(0);
- return 1;
-}
-
-
-void MPEGConfigVideo::delete_cmodel_objs()
-{
- delete preset;
- delete derivative;
- delete bitrate;
- delete fixed_bitrate;
- delete quant;
- delete fixed_quant;
- delete iframe_distance;
- delete pframe_distance;
- delete top_field_first;
- delete progressive;
- delete denoise;
- delete seq_codes;
- titles.remove_all_objects();
- reset_cmodel();
-}
-
-void MPEGConfigVideo::reset_cmodel()
-{
- preset = 0;
- derivative = 0;
- bitrate = 0;
- fixed_bitrate = 0;
- quant = 0;
- fixed_quant = 0;
- iframe_distance = 0;
- pframe_distance = 0;
- top_field_first = 0;
- progressive = 0;
- denoise = 0;
- seq_codes = 0;
-}
-
-void MPEGConfigVideo::update_cmodel_objs()
-{
- BC_Title *title;
- int x = 10;
- int y = 40;
- int x1 = x + 150;
- int x2 = x + 280;
-
- delete_cmodel_objs();
-
- if(asset->vmpeg_cmodel == BC_YUV420P)
- {
- add_subwindow(title = new BC_Title(x, y + 5, _("Format Preset:")));
- titles.append(title);
- add_subwindow(preset = new MPEGPreset(x1, y, this));
- preset->create_objects();
- y += 30;
- }
-
- add_subwindow(title = new BC_Title(x, y + 5, _("Derivative:")));
- titles.append(title);
- add_subwindow(derivative = new MPEGDerivative(x1, y, this));
- derivative->create_objects();
- y += 30;
-
- add_subwindow(title = new BC_Title(x, y + 5, _("Bitrate:")));
- titles.append(title);
- add_subwindow(bitrate = new MPEGBitrate(x1, y, this));
- add_subwindow(fixed_bitrate = new MPEGFixedBitrate(x2, y, this));
- y += 30;
-
- add_subwindow(title = new BC_Title(x, y, _("Quantization:")));
- titles.append(title);
- quant = new MPEGQuant(x1, y, this);
- quant->create_objects();
- add_subwindow(fixed_quant = new MPEGFixedQuant(x2, y, this));
- y += 30;
-
- add_subwindow(title = new BC_Title(x, y, _("I frame distance:")));
- titles.append(title);
- iframe_distance = new MPEGIFrameDistance(x1, y, this);
- iframe_distance->create_objects();
- y += 30;
-
- if(asset->vmpeg_cmodel == BC_YUV420P)
- {
- add_subwindow(title = new BC_Title(x, y, _("P frame distance:")));
- titles.append(title);
- pframe_distance = new MPEGPFrameDistance(x1, y, this);
- pframe_distance->create_objects();
- y += 30;
-
- add_subwindow(top_field_first = new BC_CheckBox(x, y, &asset->vmpeg_field_order, _("Bottom field first")));
- y += 30;
- }
-
- add_subwindow(progressive = new BC_CheckBox(x, y, &asset->vmpeg_progressive, _("Progressive frames")));
- y += 30;
- add_subwindow(denoise = new BC_CheckBox(x, y, &asset->vmpeg_denoise, _("Denoise")));
- y += 30;
- add_subwindow(seq_codes = new BC_CheckBox(x, y, &asset->vmpeg_seq_codes, _("Sequence start codes in every GOP")));
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-MPEGDerivative::MPEGDerivative(int x, int y, MPEGConfigVideo *gui)
- : BC_PopupMenu(x, y, 150, derivative_to_string(gui->asset->vmpeg_derivative))
-{
- this->gui = gui;
-}
-
-void MPEGDerivative::create_objects()
-{
- add_item(new BC_MenuItem(derivative_to_string(1)));
- add_item(new BC_MenuItem(derivative_to_string(2)));
-}
-
-int MPEGDerivative::handle_event()
-{
- gui->asset->vmpeg_derivative = string_to_derivative(get_text());
- return 1;
-};
-
-int MPEGDerivative::string_to_derivative(char *string)
-{
- if(!strcasecmp(derivative_to_string(1), string))
- return 1;
- if(!strcasecmp(derivative_to_string(2), string))
- return 2;
-
- return 1;
-}
-
-char* MPEGDerivative::derivative_to_string(int derivative)
-{
- switch(derivative)
- {
- case 1:
- return _("MPEG-1");
- break;
-
- case 2:
- return _("MPEG-2");
- break;
-
- default:
- return _("MPEG-1");
- break;
- }
-}
-
-
-
-
-
-
-
-
-
-
-
-MPEGPreset::MPEGPreset(int x, int y, MPEGConfigVideo *gui)
- : BC_PopupMenu(x, y, 200, value_to_string(gui->asset->vmpeg_preset))
-{
- this->gui = gui;
-}
-
-void MPEGPreset::create_objects()
-{
- for(int i = 0; i < 10; i++)
- {
- add_item(new BC_MenuItem(value_to_string(i)));
- }
-}
-
-int MPEGPreset::handle_event()
-{
- gui->asset->vmpeg_preset = string_to_value(get_text());
- return 1;
-}
-
-int MPEGPreset::string_to_value(char *string)
-{
- for(int i = 0; i < 10; i++)
- {
- if(!strcasecmp(value_to_string(i), string))
- return i;
- }
- return 0;
-}
-
-char* MPEGPreset::value_to_string(int derivative)
-{
- switch(derivative)
- {
- case 0: return _("Generic MPEG-1"); break;
- case 1: return _("standard VCD"); break;
- case 2: return _("user VCD"); break;
- case 3: return _("Generic MPEG-2"); break;
- case 4: return _("standard SVCD"); break;
- case 5: return _("user SVCD"); break;
- case 6: return _("VCD Still sequence"); break;
- case 7: return _("SVCD Still sequence"); break;
- case 8: return _("DVD NAV"); break;
- case 9: return _("DVD"); break;
- default: return _("Generic MPEG-1"); break;
- }
-}
-
-
-
-
-
-
-
-
-
-
-
-MPEGBitrate::MPEGBitrate(int x, int y, MPEGConfigVideo *gui)
- : BC_TextBox(x, y, 100, 1, gui->asset->vmpeg_bitrate)
-{
- this->gui = gui;
-}
-
-
-int MPEGBitrate::handle_event()
-{
- gui->asset->vmpeg_bitrate = atol(get_text());
- return 1;
-};
-
-
-
-
-
-MPEGQuant::MPEGQuant(int x, int y, MPEGConfigVideo *gui)
- : BC_TumbleTextBox(gui,
- (int64_t)gui->asset->vmpeg_quantization,
- (int64_t)1,
- (int64_t)100,
- x,
- y,
- 100)
-{
- this->gui = gui;
-}
-
-int MPEGQuant::handle_event()
-{
- gui->asset->vmpeg_quantization = atol(get_text());
- return 1;
-};
-
-MPEGFixedBitrate::MPEGFixedBitrate(int x, int y, MPEGConfigVideo *gui)
- : BC_Radial(x, y, gui->asset->vmpeg_fix_bitrate, _("Fixed bitrate"))
-{
- this->gui = gui;
-}
-
-int MPEGFixedBitrate::handle_event()
-{
- update(1);
- gui->asset->vmpeg_fix_bitrate = 1;
- gui->fixed_quant->update(0);
- return 1;
-};
-
-MPEGFixedQuant::MPEGFixedQuant(int x, int y, MPEGConfigVideo *gui)
- : BC_Radial(x, y, !gui->asset->vmpeg_fix_bitrate, _("Fixed quantization"))
-{
- this->gui = gui;
-}
-
-int MPEGFixedQuant::handle_event()
-{
- update(1);
- gui->asset->vmpeg_fix_bitrate = 0;
- gui->fixed_bitrate->update(0);
- return 1;
-};
-
-
-
-
-
-
-
-
-
-MPEGIFrameDistance::MPEGIFrameDistance(int x, int y, MPEGConfigVideo *gui)
- : BC_TumbleTextBox(gui,
- (int64_t)gui->asset->vmpeg_iframe_distance,
- (int64_t)1,
- (int64_t)100,
- x,
- y,
- 50)
-{
- this->gui = gui;
-}
-
-int MPEGIFrameDistance::handle_event()
-{
- gui->asset->vmpeg_iframe_distance = atoi(get_text());
- return 1;
-}
-
-
-
-
-
-
-
-MPEGPFrameDistance::MPEGPFrameDistance(int x, int y, MPEGConfigVideo *gui)
- : BC_TumbleTextBox(gui,
- (int64_t)gui->asset->vmpeg_pframe_distance,
- (int64_t)0,
- (int64_t)2,
- x,
- y,
- 50)
-{
- this->gui = gui;
-}
-
-int MPEGPFrameDistance::handle_event()
-{
- gui->asset->vmpeg_pframe_distance = atoi(get_text());
- return 1;
-}
-
-
-
-
-
-
-
-
-MPEGColorModel::MPEGColorModel(int x, int y, MPEGConfigVideo *gui)
- : BC_PopupMenu(x, y, 150, cmodel_to_string(gui->asset->vmpeg_cmodel))
-{
- this->gui = gui;
-}
-
-void MPEGColorModel::create_objects()
-{
- add_item(new BC_MenuItem(cmodel_to_string(BC_YUV420P)));
- add_item(new BC_MenuItem(cmodel_to_string(BC_YUV422P)));
-}
-
-int MPEGColorModel::handle_event()
-{
- gui->asset->vmpeg_cmodel = string_to_cmodel(get_text());
- gui->update_cmodel_objs();
- gui->show_window(1);
- return 1;
-};
-
-int MPEGColorModel::string_to_cmodel(char *string)
-{
- if(!strcasecmp(cmodel_to_string(BC_YUV420P), string))
- return BC_YUV420P;
- if(!strcasecmp(cmodel_to_string(BC_YUV422P), string))
- return BC_YUV422P;
- return BC_YUV420P;
-}
-
-char* MPEGColorModel::cmodel_to_string(int cmodel)
-{
- switch(cmodel)
- {
- case BC_YUV420P: return _("YUV 4:2:0");
- case BC_YUV422P: return _("YUV 4:2:2");
- default: return _("YUV 4:2:0");
- }
-}
-
-
-
-
-
-