Fixes for #26837: MPEG Preseek does not work for some h264 files.
authorSergey Sharybin <sergey.vfx@gmail.com>
Wed, 12 Oct 2011 12:49:45 +0000 (12:49 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Wed, 12 Oct 2011 12:49:45 +0000 (12:49 +0000)
- Display running job template in all sequencer modes
  It was displayed only for sequencer mode without preview.
- Fixed proxy rebuild progress indicator
  It was alsways zero because of incorrect rounding.
- Fixed timecode saving on windows (and probably some other platforms)
  It was caused by incorrect opening file for writting -- it should
  be opened in binary format "wb". This error caused incorrect
  movie duration detection on windows.
- Fixed movie resolution detection for some movies.
  In file attached to report, Blender detected resolution 1920x1088
  instead of 1920x1080. Not sure if this fix is correct or it's
  issue in FFmpeg, but it's something what mplayer using: store
  width/height before running avcodec_open().
- Fixed frame number calculation when building timecodes.
  It was rounding error caused some frames be positioned incorrect
  in several cases (that each 6th frame rendered as next frame
  from report).

release/scripts/startup/bl_ui/space_sequencer.py
source/blender/imbuf/intern/anim_movie.c
source/blender/imbuf/intern/indexer.c

index b03e7b8c59ca4846975bb3501d4425ac0b1c2e24..2e957effccdb0a8a7171c01b37edb6e7149e8365 100644 (file)
@@ -60,7 +60,6 @@ class SEQUENCER_HT_header(Header):
 
             layout.separator()
             layout.operator("sequencer.refresh_all")
-            layout.template_running_jobs()
         elif st.view_type == 'SEQUENCER_PREVIEW':
             layout.separator()
             layout.operator("sequencer.refresh_all")
@@ -76,6 +75,8 @@ class SEQUENCER_HT_header(Header):
                     row.prop(ed, "overlay_frame", text="")
                     row.prop(ed, "overlay_lock", text="", icon='LOCKED')
 
+        layout.template_running_jobs()
+
 
 class SEQUENCER_MT_view_toggle(Menu):
     bl_label = "View Type"
index b9500c2f79840a802e3aa356eb54e2f10aaf58e1..c07326c12376dc7d52aa0818352b952561bd0efe 100644 (file)
@@ -418,6 +418,7 @@ static int startffmpeg(struct anim * anim) {
        int frs_num;
        double frs_den;
        int streamcount;
+       int width, height;
 
 #ifdef FFMPEG_SWSCALE_COLOR_SPACE_SUPPORT
        /* The following for color space determination */
@@ -474,6 +475,9 @@ static int startffmpeg(struct anim * anim) {
 
        pCodecCtx->workaround_bugs = 1;
 
+       width = pCodecCtx->width;
+       height = pCodecCtx->height;
+
        if(avcodec_open(pCodecCtx, pCodec) < 0) {
                av_close_input_file(pFormatCtx);
                return -1;
@@ -498,8 +502,8 @@ static int startffmpeg(struct anim * anim) {
 
        anim->params = 0;
 
-       anim->x = pCodecCtx->width;
-       anim->y = pCodecCtx->height;
+       anim->x = width;
+       anim->y = height;
        anim->interlacing = 0;
        anim->orientation = 0;
        anim->framesize = anim->x * anim->y * 4;
index d79e881e5a2757e7e0dc89df512d369f0cc6558d..3f764e4d4522b9488222c900a202bc949b30d4e9 100644 (file)
@@ -87,7 +87,7 @@ anim_index_builder * IMB_index_builder_create(const char * name)
 
        BLI_make_existing_file(rv->temp_name);
 
-       rv->fp = fopen(rv->temp_name, "w");
+       rv->fp = fopen(rv->temp_name, "wb");
 
        if (!rv->fp) {
                fprintf(stderr, "Couldn't open index target: %s! "
@@ -797,7 +797,7 @@ static int index_rebuild_ffmpeg(struct anim * anim,
 
        while(av_read_frame(iFormatCtx, &next_packet) >= 0) {
                int frame_finished = 0;
-               float next_progress =  ((int)floor(((double) next_packet.pos) * 100 /
+               float next_progress =  (float)((int)floor(((double) next_packet.pos) * 100 /
                                                   ((double) stream_size)+0.5)) / 100;
 
                if (*progress != next_progress) {
@@ -840,8 +840,8 @@ static int index_rebuild_ffmpeg(struct anim * anim,
                                start_pts_set = TRUE;
                        }
 
-                       frameno = (pts - start_pts) 
-                               * pts_time_base * frame_rate
+                       frameno = round((pts - start_pts) 
+                               * pts_time_base * frame_rate);
 
                        /* decoding starts *always* on I-Frames,
                           so: P-Frames won't work, even if all the