BUT FAILED.

in sense my mod apparently  just leaks (swsContext?) so it can't play even
20 sec of 1440*1080 video to completion in termux, running on tablet with
3Gb ram.

There seems to be difference if I set thread count manually (on file
reading only for now) but it looks negative, in other words higher thread
count -> slower total playback .. tried 8, 4,1,16 on 8 cpu tablet. Speed
was going down from 18 fps for unaltered cingg to 13 with 8 threads and
crash/oom with 16 ;)

And if I try to use sws_scale_frame I just got all blank/black frames  on
timeline ....

I think switching to sws_scale_frame is important if we want to try new
colormanagement support in ffmpeg.git ...

Resources used, apart from that Blender diff:

https://github.com/mltframework/mlt/blob/master/src/modules/avformat/filter_swscale.c
diff --git a/cinelerra-5.1/cinelerra/ffmpeg.C b/cinelerra-5.1/cinelerra/ffmpeg.C
index c8c533ce..a2635a4b 100644
--- a/cinelerra-5.1/cinelerra/ffmpeg.C
+++ b/cinelerra-5.1/cinelerra/ffmpeg.C
@@ -1610,9 +1610,15 @@ int FFVideoConvert::convert_picture_vframe(VFrame 
*frame, AVFrame *ip, AVFrame *
        int cmodel = frame->get_color_model();
        AVPixelFormat ofmt = color_model_to_pix_fmt(cmodel);
        if( ofmt == AV_PIX_FMT_NB ) return -1;
+       
+       //int size = av_image_get_buffer_size(ofmt, frame->get_w(), 
frame->get_h(), 1);
+        //AVBufferRef *buf = av_buffer_alloc(size);
+       
        int size = av_image_fill_arrays(ipic->data, ipic->linesize,
                frame->get_data(), ofmt, frame->get_w(), frame->get_h(), 1);
+       
        if( size < 0 ) return -1;
+       //av_frame_get_buffer(ipic, 0);
 
        int bpp = BC_CModels::calculate_pixelsize(cmodel);
        int ysz = bpp * frame->get_w(), usz = ysz;
@@ -1653,9 +1659,39 @@ int FFVideoConvert::convert_picture_vframe(VFrame 
*frame, AVFrame *ip, AVFrame *
                        return -1;
                }
        }
-       int flags= SWS_BITEXACT | SWS_ACCURATE_RND ;
-       convert_ctx = sws_getCachedContext(convert_ctx, ip->width, ip->height, 
pix_fmt,
-               frame->get_w(), frame->get_h(), ofmt, SWS_POINT| flags, NULL, 
NULL, NULL);
+       int flags= SWS_POINT |  SWS_BITEXACT | SWS_ACCURATE_RND ;
+       //convert_ctx = sws_getCachedContext(convert_ctx, ip->width, 
ip->height, pix_fmt,
+       //      frame->get_w(), frame->get_h(), ofmt, SWS_POINT| flags, NULL, 
NULL, NULL);
+       ;
+       SwsContext *convert_ctx = sws_alloc_context();
+
+    int ret_sws;
+/*
+    convert_ctx = sws_alloc_context();
+    convert_ctx->src_w      = ip->width;
+    convert_ctx->src_h      = ip->height;
+    convert_ctx->src_format = pix_fmt;
+    convert_ctx->dst_w      = frame->get_w();
+    convert_ctx->dst_h      = frame->get_h(); 
+    convert_ctx->dst_format = ofmt;
+    convert_ctx->flags      = flags;
+    convert_ctx->dither     = NULL;
+    convert_ctx->threads    = 8;
+    */
+    
+  av_opt_set_int(convert_ctx, "srcw", ip->width, 0);
+  av_opt_set_int(convert_ctx, "srch", ip->height, 0);
+  av_opt_set_int(convert_ctx, "src_format", pix_fmt, 0);
+  av_opt_set_int(convert_ctx, "dstw", frame->get_w(), 0);
+  av_opt_set_int(convert_ctx, "dsth", frame->get_h(), 0);
+  av_opt_set_int(convert_ctx, "dst_format", ofmt, 0);
+  av_opt_set_int(convert_ctx, "sws_flags", flags, 0);
+  av_opt_set_int(convert_ctx, "threads", 0, 0);
+    
+      if ((ret_sws = sws_init_context(convert_ctx, NULL, NULL)) < 0)
+      return -1;
+
+       
        if( !convert_ctx ) {
                fprintf(stderr, "FFVideoConvert::convert_picture_frame:"
                                " sws_getCachedContext() failed\n");
@@ -1688,9 +1724,15 @@ int FFVideoConvert::convert_picture_vframe(VFrame 
*frame, AVFrame *ip, AVFrame *
                                        color_table, color_range, color_table, 
color_range,
                                        brightness, contrast, saturation);
        }
-
+       
+       enum AVColorTransferCharacteristic trc = AVCOL_TRC_ARIB_STD_B67;
+       ip->color_trc = AVCOL_TRC_LINEAR;
+       ipic->color_trc = trc;
+       
+       
        int ret = sws_scale(convert_ctx, ip->data, ip->linesize, 0, ip->height,
            ipic->data, ipic->linesize);
+       //int ret = sws_scale_frame(convert_ctx, ipic, ip);
        if( ret < 0 ) {
                ff_err(ret, "FFVideoConvert::convert_picture_frame: sws_scale() 
failed\nfile: %s\n",
                        vid->ffmpeg->fmt_ctx->url);
-- 
Cin mailing list
[email protected]
https://lists.cinelerra-gg.org/mailman/listinfo/cin

Reply via email to