repair default keyframe load, tweak init default histogram threshold
[goodguy/history.git] / cinelerra-5.1 / cinelerra / fileogg.C
index 6c789b39100fd14c3e21c03708157b894c575588..99995fe975711988a77aec82167f866e9b3851c2 100644 (file)
@@ -100,10 +100,8 @@ FileOGG::~FileOGG()
 }
 
 void FileOGG::get_parameters(BC_WindowBase *parent_window,
-       Asset *asset,
-       BC_WindowBase* &format_window,
-       int audio_options,
-       int video_options)
+       Asset *asset, BC_WindowBase* &format_window,
+       int audio_options, int video_options, EDL *edl)
 {
        if(audio_options)
        {
@@ -1501,15 +1499,9 @@ int FileOGG::read_frame(VFrame *frame)
                yuv.v += yuv.uv_stride * (yuv.uv_height - 1);
                yuv.y_stride = - yuv.y_stride;
                yuv.uv_stride = - yuv.uv_stride;*/
-               VFrame *temp_frame = new VFrame(yuv.y,
-                                               -1,
-                                               0,
-                                               yuv.u - yuv.y,
-                                               yuv.v - yuv.y,
-                                               - yuv.y_stride,
-                                               yuv.y_height,
-                                               BC_YUV420P,
-                                               - yuv.y_stride);
+               VFrame *temp_frame = new VFrame(yuv.y, -1, 0,
+                                       yuv.u - yuv.y, yuv.v - yuv.y, - yuv.y_stride,
+                                       yuv.y_height, BC_YUV420P, - yuv.y_stride);
                // copy into temp frame...
 
                BC_CModels::transfer(frame->get_rows(),
@@ -1959,12 +1951,7 @@ int FileOGG::write_frames_theora(VFrame ***frames, int len, int e_o_s)
 
                if (!temp_frame)
                {
-                       temp_frame = new VFrame (0,
-                                               -1,
-                                               tf->ti.width,
-                                               tf->ti.height,
-                                               BC_YUV420P,
-                                               -1);
+                       temp_frame = new VFrame ( tf->ti.width, tf->ti.height, BC_YUV420P, 0);
                }
                VFrame *frame = frames[0][j];
                int in_color_model = frame->get_color_model();
@@ -2016,8 +2003,7 @@ OGGConfigAudio::OGGConfigAudio(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),
-       350,
-       250)
+       350, 250)
 {
        this->parent_window = parent_window;
        this->asset = asset;
@@ -2143,8 +2129,7 @@ OGGConfigVideo::OGGConfigVideo(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),
-       450,
-       220)
+       450, 220)
 {
        this->parent_window = parent_window;
        this->asset = asset;
@@ -2169,18 +2154,10 @@ void OGGConfigVideo::create_objects()
        y += 30;
 
        add_subwindow(new BC_Title(x, y, _("Quality:")));
-       add_subwindow(new BC_ISlider(x + 80,
-               y,
-               0,
-               200,
-               200,
-               0,
-               63,
-               asset->theora_quality,
-               0,
-               0,
-               &asset->theora_quality));
-
+       add_subwindow(new BC_ISlider(x + 80, y, 0,
+               200, 200, 0, 63,
+               asset->theora_quality, 0,
+               0, &asset->theora_quality));
 
        add_subwindow(fixed_quality = new OGGTheoraFixedQuality(x2, y, this));
        y += 30;
@@ -2210,8 +2187,6 @@ void OGGConfigVideo::create_objects()
 }
 
 
-
-
 int OGGConfigVideo::close_event()
 {
        set_done(0);
@@ -2334,7 +2309,7 @@ PackagingEngineOGG::~PackagingEngineOGG()
                delete [] packages;
        }
        if (default_asset)
-               delete default_asset;
+               default_asset->remove_user();
 }
 
 
@@ -2342,8 +2317,8 @@ PackagingEngineOGG::~PackagingEngineOGG()
 int PackagingEngineOGG::create_packages_single_farm(
                EDL *edl,
                Preferences *preferences,
-               Asset *default_asset, 
-               double total_start, 
+               Asset *default_asset,
+               double total_start,
                double total_end)
 {
        this->total_start = total_start;
@@ -2352,7 +2327,7 @@ int PackagingEngineOGG::create_packages_single_farm(
 
        this->preferences = preferences;
 
-// We make A COPY of the asset, because we set audio_data = 0 on local asset which is the same copy as default_asset... 
+// We make A COPY of the asset, because we set audio_data = 0 on local asset which is the same copy as default_asset...
 // Should be taken care of somewhere else actually
        this->default_asset = new Asset(*default_asset);
 
@@ -2379,10 +2354,12 @@ int PackagingEngineOGG::create_packages_single_farm(
        if (default_asset->audio_data)
        {
                packages[local_current_package] = new RenderPackage;
-               sprintf(packages[current_package]->path, "%s.audio", default_asset->path);
+               snprintf(packages[current_package]->path,
+                       sizeof(packages[current_package]->path),
+                       "%s.audio", default_asset->path);
                local_current_package++;
        }
-       
+
        if (default_asset->video_data)
        {
                video_package_len = (total_len) / preferences->renderfarm_job_count;
@@ -2390,17 +2367,17 @@ int PackagingEngineOGG::create_packages_single_farm(
                int number_start;      // Character in the filename path at which the number begins
                int total_digits;      // Total number of digits including padding the user specified.
 
-               Render::get_starting_number(default_asset->path, 
+               Render::get_starting_number(default_asset->path,
                        current_number,
-                       number_start, 
+                       number_start,
                        total_digits,
                        3);
 
                for(int i = 0; i < preferences->renderfarm_job_count; i++)
                {
                        RenderPackage *package = packages[local_current_package] = new RenderPackage;
-                       Render::create_filename(package->path, 
-                               default_asset->path, 
+                       Render::create_filename(package->path,
+                               default_asset->path,
                                current_number,
                                total_digits,
                                number_start);
@@ -2411,7 +2388,7 @@ int PackagingEngineOGG::create_packages_single_farm(
        return 0;
 }
 
-RenderPackage* PackagingEngineOGG::get_package_single_farm(double frames_per_second, 
+RenderPackage* PackagingEngineOGG::get_package_single_farm(double frames_per_second,
                int client_number,
                int use_local_rate)
 {
@@ -2439,13 +2416,13 @@ RenderPackage* PackagingEngineOGG::get_package_single_farm(double frames_per_sec
 
                result->audio_start = audio_position;
                result->video_start = video_position;
-               result->audio_end = audio_position + 
+               result->audio_end = audio_position +
                        Units::round(video_package_len * default_asset->sample_rate);
-               result->video_end = video_position + 
+               result->video_end = video_position +
                        Units::round(video_package_len * default_asset->frame_rate);
 
 // Last package... take it all!
-               if (current_package == total_packages -1 ) 
+               if (current_package == total_packages -1 )
                {
                        result->audio_end = audio_end;
                        result->video_end = video_end;
@@ -2455,7 +2432,7 @@ RenderPackage* PackagingEngineOGG::get_package_single_farm(double frames_per_sec
                video_position = result->video_end;
 
        }
-       
+
        current_package ++;
        return result;
 
@@ -2474,9 +2451,9 @@ void PackagingEngineOGG::get_package_paths(ArrayList<char*> *path_list)
 
 int64_t PackagingEngineOGG::get_progress_max()
 {
-       return Units::to_int64(default_asset->sample_rate * 
+       return Units::to_int64(default_asset->sample_rate *
                        (total_end - total_start)) * 2+
-               Units::to_int64(preferences->render_preroll * 
+               Units::to_int64(preferences->render_preroll *
                        total_packages *
                        default_asset->sample_rate);
 }
@@ -2485,7 +2462,7 @@ int PackagingEngineOGG::packages_are_done()
 {
 
 
-// Mux audio and video into one file   
+// Mux audio and video into one file
 
 // First fix our asset... have to workaround the bug of corruption of local asset
 //     Render::check_asset(edl, *default_asset);
@@ -2494,11 +2471,12 @@ int PackagingEngineOGG::packages_are_done()
        File *audio_file_gen = 0, *video_file_gen = 0;
        FileOGG *video_file = 0, *audio_file = 0;
        ogg_stream_state audio_in_stream, video_in_stream;
-       
+
        int local_current_package = 0;
        if (default_asset->audio_data)
        {
                audio_asset = new Asset(packages[local_current_package]->path);
+               audio_asset->format = FILE_OGG;
                local_current_package++;
 
                audio_file_gen = new File();
@@ -2511,6 +2489,7 @@ int PackagingEngineOGG::packages_are_done()
        if (default_asset->video_data)
        {
                video_asset = new Asset(packages[local_current_package]->path);
+               video_asset->format = FILE_OGG;
                local_current_package++;
 
                video_file_gen = new File();
@@ -2550,8 +2529,9 @@ int PackagingEngineOGG::packages_are_done()
                                                ogg_stream_clear(&video_in_stream);
                                                video_file_gen->close_file();
                                                delete video_file_gen;
-                                               delete video_asset;
+                                               if( video_asset ) video_asset->remove_user();
                                                video_asset = new Asset(packages[local_current_package]->path);
+                                               video_asset->format = FILE_OGG;
                                                local_current_package++;
 
                                                video_file_gen = new File();
@@ -2580,20 +2560,20 @@ int PackagingEngineOGG::packages_are_done()
                                int64_t granulepos = op.granulepos;
                                if (granulepos != -1)
                                {
-                               // Fix granulepos!      
+                               // Fix granulepos!
                                        int64_t rel_iframe = granulepos >> video_file->theora_keyframe_granule_shift;
                                        int64_t rel_pframe = granulepos - (rel_iframe << video_file->theora_keyframe_granule_shift);
                                        int64_t rel_current_frame = rel_iframe + rel_pframe;
                                        current_frame = frame_offset + rel_current_frame;
                                        int64_t abs_iframe = current_frame - rel_pframe;
-                                       
+
                                        op.granulepos = (abs_iframe << video_file->theora_keyframe_granule_shift) + rel_pframe;
-                                       
-//                                     printf("iframe: %i, pframe: %i, granulepos: %i, op.packetno %lli, abs_iframe: %i\n", rel_iframe, rel_pframe, granulepos, op.packetno, abs_iframe);                              
-                               
+
+//                                     printf("iframe: %i, pframe: %i, granulepos: %i, op.packetno %lli, abs_iframe: %i\n", rel_iframe, rel_pframe, granulepos, op.packetno, abs_iframe);
+
                                }
                                ogg_stream_packetin (&output_file->tf->to, &op);
-                               output_file->tf->v_pkg++; 
+                               output_file->tf->v_pkg++;
                        }
                }
                if (audio_ready)
@@ -2612,42 +2592,44 @@ int PackagingEngineOGG::packages_are_done()
                                ogg_stream_packetout(&audio_in_stream, &op);
                                ogg_stream_packetin (&output_file->tf->vo, &op);
                                audio_packetno++;
-                               output_file->tf->a_pkg++; 
+                               output_file->tf->a_pkg++;
                        }
                }
-               
+
                output_file->flush_ogg(0);
-               
-       
+
+
        }
-       
-// flush_ogg(1) is called on file closing time...      
+
+// flush_ogg(1) is called on file closing time...
 //     output_file->flush_ogg(1);
 
 // Just prevent thet write_samples and write_frames are called
        output_file->final_write = 0;
-               
+
        if (default_asset->audio_data)
        {
                ogg_stream_clear(&audio_in_stream);
                audio_file_gen->close_file();
                delete audio_file_gen;
-               delete audio_asset;
+               if( audio_asset )
+                       audio_asset->remove_user();
        }
        if (default_asset->video_data)
        {
                ogg_stream_clear(&video_in_stream);
                video_file_gen->close_file();
                delete video_file_gen;
-               delete video_asset;
+               if( video_asset )
+                       video_asset->remove_user();
        }
 
        output_file_gen->close_file();
        delete output_file_gen;
 
-// Now delete the temp files
-       for(int i = 0; i < total_packages; i++)
-               unlink(packages[i]->path);
+// don't delete the temp files, for now
+//     for(int i = 0; i < total_packages; i++)
+//             unlink(packages[i]->path);
 
        return 0;
 }