X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Ffilempeg.C;h=54b006fc46eabda718bb573092bbb12a1030e2c7;hb=9f917bc27389ebc36568a1f465b42208f7e8e46a;hp=96df8847e11e77cc1c8e1a71a19f264b2366271c;hpb=190b4810ec184c74ceab3fcd6faf09a91c92c53c;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/cinelerra/filempeg.C b/cinelerra-5.1/cinelerra/filempeg.C index 96df8847..54b006fc 100644 --- a/cinelerra-5.1/cinelerra/filempeg.C +++ b/cinelerra-5.1/cinelerra/filempeg.C @@ -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 == BC_ILACE_MODE_UNDETECTED ) +// asset->interlace_mode = mpeg3_detect_interlace(fd, 0); if( !asset->layers ) { asset->layers = mpeg3_total_vstreams(fd); } @@ -490,9 +494,9 @@ int FileMPEG::open_file(int rd, int wr) // Construct command line if(!result) { - char string[BCTEXTLEN]; - get_exe_path(string); - sprintf(mjpeg_command, "%s/%s", string, HVPEG_EXE); + 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) { @@ -516,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 @@ -540,9 +544,8 @@ int FileMPEG::open_file(int rd, int wr) // 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); + const char *exec_path = File::get_cinlib_path(); + sprintf(mjpeg_command, "%s/%s -v 0 ", exec_path, MJPEG_EXE); // Must disable interlacing if MPEG-1 switch (asset->vmpeg_preset) @@ -552,9 +555,7 @@ 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. if(asset->vmpeg_fix_bitrate) @@ -1271,6 +1272,10 @@ 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 == BC_ILACE_MODE_TOP_FIRST || + asset->interlace_mode == BC_ILACE_MODE_BOTTOM_FIRST ) ) + output_cmodel = BC_YUV420PI; case BC_YUV422P: break; default: @@ -1388,27 +1393,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(); @@ -1515,12 +1500,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 == BC_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() ) { @@ -1574,20 +1560,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 == BC_ILACE_MODE_TOP_FIRST || + asset->interlace_mode == BC_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; @@ -1875,10 +1857,7 @@ void MPEGABitrate::create_objects() void MPEGABitrate::set_layer(int layer) { - while(total_items()) - { - remove_item(0); - } + while(total_items()) del_item(0); if(layer == 2) { @@ -2092,17 +2071,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)) { @@ -2123,42 +2091,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)) { @@ -2167,8 +2114,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))); } } @@ -2181,8 +2127,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; } @@ -2191,20 +2136,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"); }