X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Ffilempeg.C;h=5c9b9bd3463cb0da38521906a08460ce45ac231a;hp=c51cf4463fe5973a8545b286607a0cca1191fab8;hb=21c2e6b36d6a96c2f662a89459d607b5a387f4eb;hpb=089f2be86316b88f72a6c359ab10e2b95539005b diff --git a/cinelerra-5.1/cinelerra/filempeg.C b/cinelerra-5.1/cinelerra/filempeg.C index c51cf446..5c9b9bd3 100644 --- a/cinelerra-5.1/cinelerra/filempeg.C +++ b/cinelerra-5.1/cinelerra/filempeg.C @@ -2,21 +2,21 @@ /* * CINELERRA * Copyright (C) 2008 Adam Williams - * + * * 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" @@ -55,7 +55,7 @@ // M JPEG dependancies -static double frame_rate_codes[] = +static double frame_rate_codes[] = { 0, 24000.0/1001.0, @@ -104,8 +104,8 @@ FileMPEG::~FileMPEG() vcommand_line.remove_all_objects(); } -void FileMPEG::get_parameters(BC_WindowBase *parent_window, - Asset *asset, +void FileMPEG::get_parameters(BC_WindowBase *parent_window, + Asset *asset, BC_WindowBase* &format_window, int audio_options, int video_options) @@ -159,7 +159,7 @@ void FileMPEG::get_info(char *title_path, char *path, char *text, int len) cp += snprintf(cp,ep-cp, _("file path:%s\n"), path); int64_t bytes = mpeg3_get_bytes(fd); char string[BCTEXTLEN]; - sprintf(string,"%ld",bytes); + sprintf(string,"%jd",bytes); Units::punctuate(string); cp += snprintf(cp,ep-cp, _("size: %s"), string); @@ -192,7 +192,7 @@ void FileMPEG::get_info(char *title_path, char *path, char *text, int len) 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); + cp += snprintf(cp,ep-cp, _(" (%5.2f), %jd frames"), frame_rate, frames); if( frame_rate > 0 ) { double secs = (double)frames / frame_rate; cp += snprintf(cp,ep-cp, _(" (%0.3f secs)"),secs); @@ -208,10 +208,10 @@ void FileMPEG::get_info(char *title_path, char *path, char *text, int len) 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); + cp += snprintf(cp,ep-cp, " %jd",samples); int64_t nudge = mpeg3_get_audio_nudge(fd, atrk); *cp++ = nudge >= 0 ? '+' : (nudge=-nudge, '-'); - cp += snprintf(cp,ep-cp, _("%ld samples"),nudge); + cp += snprintf(cp,ep-cp, _("%jd samples"),nudge); if( sample_rate > 0 ) { double secs = (double)(samples+nudge) / sample_rate; cp += snprintf(cp,ep-cp, _(" (%0.3f secs)"),secs); @@ -244,7 +244,7 @@ void FileMPEG::get_info(char *title_path, char *path, char *text, int len) cp += snprintf(cp,ep-cp, _("cell times:")); for( int i=0; ivideo_data = mpeg3_has_video(fd); if( !result && asset->video_data ) { - asset->interlace_mode = BC_ILACE_MODE_UNDETECTED; +//TODO: this is not as easy as just looking at headers. +//most interlaced media is rendered as FRM, not TOP/BOT in coding ext hdrs. +//currently, just using the assetedit menu to set the required result as needed. +// if( asset->interlace_mode == ILACE_MODE_UNDETECTED ) +// asset->interlace_mode = mpeg3_detect_interlace(fd, 0); if( !asset->layers ) { asset->layers = mpeg3_total_vstreams(fd); } @@ -473,7 +477,7 @@ int FileMPEG::open_file(int rd, int wr) eprintf(_("Couldn't open %s: failed.\n"), asset->path); } } - + if( !result && wr && asset->format == FILE_VMPEG ) { // Heroine Virtual encoder // this one is cinelerra-x.x.x/mpeg2enc @@ -492,6 +496,7 @@ int FileMPEG::open_file(int rd, int wr) { const char *exec_path = File::get_cinlib_path(); sprintf(mjpeg_command, "%s/%s", exec_path, HVPEG_EXE); + append_vcommand_line(mjpeg_command); if(asset->aspect_ratio > 0) { @@ -515,7 +520,7 @@ int FileMPEG::open_file(int rd, int wr) append_vcommand_line(asset->vmpeg_cmodel == BC_YUV422P ? "-422" : ""); if(asset->vmpeg_fix_bitrate) { - append_vcommand_line("--cbr -b"); + append_vcommand_line("-b"); append_vcommand_line(bitrate_string); } else @@ -550,9 +555,6 @@ int FileMPEG::open_file(int rd, int wr) case 2: asset->vmpeg_progressive = 1; break; } -// Be quiet - strcat(mjpeg_command, " -v0"); - char string[BCTEXTLEN]; // The current usage of mpeg2enc requires bitrate of 0 when quantization is fixed and // quantization of 1 when bitrate is fixed. Perfectly intuitive. @@ -590,7 +592,7 @@ int FileMPEG::open_file(int rd, int wr) // 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); @@ -627,9 +629,9 @@ int FileMPEG::open_file(int rd, int wr) - strcat(mjpeg_command, + strcat(mjpeg_command, asset->vmpeg_progressive ? " -I 0" : " -I 1"); - + sprintf(string, " -M %d", file->cpus); @@ -697,7 +699,7 @@ int FileMPEG::open_file(int rd, int wr) // 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, + lame_set_in_samplerate(lame_global, asset->sample_rate); lame_set_num_channels(lame_global, asset->channels); @@ -845,7 +847,7 @@ int FileMPEG::create_toc(char *toc_path) sprintf(string, "%sETA: %jdm%jds", progress_title, eta / 60, eta % 60); progress.update_title(string, 1); -// fprintf(stderr, "ETA: %dm%ds \r", +// fprintf(stderr, "ETA: %dm%ds \r", // bytes_processed * 100 / total_bytes, // eta / 60, eta % 60); // fflush(stdout); @@ -950,7 +952,7 @@ int FileMPEG::close_file() vcommand_line.remove_all_objects(); if(twofp) { - unsigned char opkt[1152*2]; + unsigned char opkt[1152*2]; int ret = twolame_encode_flush(twopts, opkt, sizeof(opkt)); if( ret > 0 ) fwrite(opkt, 1, ret, twofp); @@ -997,13 +999,9 @@ int FileMPEG::get_best_colormodel(Asset *asset, int driver) 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; @@ -1016,9 +1014,6 @@ int FileMPEG::get_best_colormodel(Asset *asset, int driver) 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; @@ -1041,7 +1036,7 @@ int FileMPEG::set_audio_position(int64_t sample) { #if 0 if(!fd) return 1; - + int channel, stream; to_streamchannel(file->current_channel, stream, channel); @@ -1270,12 +1265,16 @@ int FileMPEG::write_frames(VFrame ***frames, int len) // verify colormodel supported in MPEG output switch( output_cmodel ) { case BC_YUV420P: + if( file->preferences->dvd_yuv420p_interlace && + ( asset->interlace_mode == ILACE_MODE_TOP_FIRST || + asset->interlace_mode == ILACE_MODE_BOTTOM_FIRST ) ) + output_cmodel = BC_YUV420PI; 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; @@ -1283,23 +1282,23 @@ int FileMPEG::write_frames(VFrame ***frames, int len) 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, + mpeg2enc_set_input_buffers(0, (char*)frame->get_y(), (char*)frame->get_u(), (char*)frame->get_v()); @@ -1318,15 +1317,15 @@ int FileMPEG::write_frames(VFrame ***frames, int len) if(!temp_frame) { - temp_frame = new VFrame(0, + temp_frame = new VFrame(0, -1, - temp_w, - temp_h, + temp_w, + temp_h, output_cmodel, -1); } - BC_CModels::transfer(temp_frame->get_rows(), + BC_CModels::transfer(temp_frame->get_rows(), frame->get_rows(), temp_frame->get_y(), temp_frame->get_u(), @@ -1342,13 +1341,13 @@ int FileMPEG::write_frames(VFrame ***frames, int len) 0, temp_frame->get_w(), temp_frame->get_h(), - frame->get_color_model(), + frame->get_color_model(), temp_frame->get_color_model(), - 0, + 0, frame->get_w(), temp_frame->get_w()); - mpeg2enc_set_input_buffers(0, + mpeg2enc_set_input_buffers(0, (char*)temp_frame->get_y(), (char*)temp_frame->get_u(), (char*)temp_frame->get_v()); @@ -1369,15 +1368,15 @@ int FileMPEG::write_frames(VFrame ***frames, int len) //printf("FileMPEG::write_frames %d\n", __LINE__);sleep(1); if(!temp_frame) { - temp_frame = new VFrame(0, + temp_frame = new VFrame(0, -1, - asset->width, - asset->height, + 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", +// 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(), @@ -1387,27 +1386,7 @@ int FileMPEG::write_frames(VFrame ***frames, int len) // 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()); + temp_frame->transfer_from(frame); //printf("FileMPEG::write_frames %d\n", __LINE__);sleep(1); mjpeg_y = temp_frame->get_y(); @@ -1437,7 +1416,7 @@ int FileMPEG::write_frames(VFrame ***frames, int len) } int FileMPEG::zmpeg3_cmdl(int colormodel) -{ +{ switch( colormodel ) { case BC_BGR888: return zmpeg3_t::cmdl_BGR888; case BC_BGR8888: return zmpeg3_t::cmdl_BGRA8888; @@ -1452,7 +1431,7 @@ int FileMPEG::zmpeg3_cmdl(int colormodel) case BC_YUVA8888: return zmpeg3_t::cmdl_YUVA8888; } return -1; -} +} int FileMPEG::bc_colormodel(int cmdl) { @@ -1514,12 +1493,13 @@ int FileMPEG::read_frame(VFrame *frame) 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); + int frame_cmdl = asset->interlace_mode == ILACE_MODE_NOTINTERLACED ? + zmpeg3_cmdl(frame_color_model) : -1; mpeg3_show_subtitle(fd, file->current_layer, file->playback_subtitle); - switch( frame_color_model ) { // check for direct copy case BC_YUV420P: + if( frame_cmdl < 0 ) break; case BC_YUV422P: if( stream_color_model == frame_color_model && width == frame->get_w() && height == frame->get_h() ) { @@ -1560,11 +1540,11 @@ int FileMPEG::read_frame(VFrame *frame) for( int i=0; iget_w(), /* Dimensions of output_rows */ - frame->get_h(), + frame->get_h(), frame_cmdl, file->current_layer); return result; @@ -1573,20 +1553,16 @@ int FileMPEG::read_frame(VFrame *frame) char *y, *u, *v; mpeg3_read_yuvframe_ptr(fd, &y, &u, &v, file->current_layer); if( y && u && v ) { + if( stream_color_model == BC_YUV420P && + file->preferences->dvd_yuv420p_interlace && ( + asset->interlace_mode == ILACE_MODE_TOP_FIRST || + asset->interlace_mode == ILACE_MODE_BOTTOM_FIRST ) ) + stream_color_model = BC_YUV420PI; 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()); + 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; @@ -1616,10 +1592,10 @@ int FileMPEG::read_samples(double *buffer, int64_t len) //printf("FileMPEG::read_samples 1 current_sample=%jd len=%jd channel=%d\n", file->current_sample, len, channel); - mpeg3_set_sample(fd, + mpeg3_set_sample(fd, file->current_sample, stream); - mpeg3_read_audio_d(fd, + mpeg3_read_audio_d(fd, buffer, /* Pointer to pre-allocated buffer of doubles */ channel, /* Channel to decode */ len, /* Number of samples to decode */ @@ -2088,17 +2064,6 @@ void MPEGConfigVideo::update_cmodel_objs() } - - - - - - - - - - - MPEGDerivative::MPEGDerivative(int x, int y, MPEGConfigVideo *gui) : BC_PopupMenu(x, y, 150, derivative_to_string(gui->asset->vmpeg_derivative)) { @@ -2119,42 +2084,21 @@ int MPEGDerivative::handle_event() 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; - + 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; + switch(derivative) { + case 1: return _("MPEG-1"); + case 2: return _("MPEG-2"); } + return _("MPEG-1"); } - - - - - - - - - MPEGPreset::MPEGPreset(int x, int y, MPEGConfigVideo *gui) : BC_PopupMenu(x, y, 200, value_to_string(gui->asset->vmpeg_preset)) { @@ -2163,8 +2107,7 @@ MPEGPreset::MPEGPreset(int x, int y, MPEGConfigVideo *gui) void MPEGPreset::create_objects() { - for(int i = 0; i < 10; i++) - { + for(int i = 0; i < 14; i++) { add_item(new BC_MenuItem(value_to_string(i))); } } @@ -2177,8 +2120,7 @@ int MPEGPreset::handle_event() int MPEGPreset::string_to_value(char *string) { - for(int i = 0; i < 10; i++) - { + for(int i = 0; i < 14; i++) { if(!strcasecmp(value_to_string(i), string)) return i; } @@ -2187,20 +2129,23 @@ int MPEGPreset::string_to_value(char *string) 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; + 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; + case 10: return _("ATSC 480i"); break; + case 11: return _("ATSC 480p"); break; + case 12: return _("ATSC 720p"); break; + case 13: return _("ATSC 1080i"); break; } + return _("Generic MPEG-1"); }