remove v4l/lml/buz, add symbolic folders, more xlat update, yuyv fixes, v4l2 upgrades
[goodguy/history.git] / cinelerra-5.1 / cinelerra / filempeg.C
index fc188a145d71ffe73433be480bbb5aed5ff8d639..59c4db2836841bbe74adf012faa04c43ba39d527 100644 (file)
@@ -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);
@@ -451,7 +451,11 @@ int FileMPEG::open_file(int rd, int wr)
 
                        asset->video_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);
                                }
@@ -551,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.
@@ -998,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;
@@ -1017,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;
@@ -1271,6 +1265,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 == ILACE_MODE_TOP_FIRST ||
+                             asset->interlace_mode == ILACE_MODE_BOTTOM_FIRST ) )
+                               output_cmodel = BC_YUV420PI;
                case BC_YUV422P:
                        break;
                default:
@@ -1388,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();
@@ -1515,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() ) {
@@ -1574,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;