[CinCV] review for support for swscale using external-ffmpeg

Top Page
Attachments:
Message as email
+ (text/plain)
+ ffmpeg.patch (text/x-diff)
+ signature.asc (application/pgp-signature)
Delete this message
Reply to this message
Author: rafael2k
Date:  
To: cinelerra
Subject: [CinCV] review for support for swscale using external-ffmpeg
hi all,
people that uses external-ffmpeg, can all test the patch based in the adrian
pranti macos x patch to support the sws_* api functions of ffmpeg (make sure
to compile your ffmpeg w/ swscale).
I prentend to commit this patch to svn, if no problem is found in it.

thx,
rafael diniz

-- 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Ciência da Computação @  Unicamp
Rádio Muda, radiolivre.org, TV Piolho, tvlivre.org, www.midiaindependente.org
Chave PGP: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x2FF86098
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-


Index: configure.in
===================================================================
--- configure.in    (revision 1055)
+++ configure.in    (working copy)
@@ -345,9 +345,30 @@
AC_ARG_WITH([external-ffmpeg], AC_HELP_STRING([--with-external-ffmpeg], [use external ffmpeg library]))

if test "x$with_external_ffmpeg" = "xyes"; then
- PKG_CHECK_MODULES([FFMPEG], [libavcodec libpostproc])
+ PKG_CHECK_MODULES([FFMPEG_TEMP], [libavcodec libpostproc])
FFMPEG_FOLDER=""
FFMPEG_EXTERNALTEXT="External ffmpeg"
+        
+ dnl --------------------------------------------------------------
+ dnl check if libavcodec contains img_convert
+ dnl if not, that means that libswscale is compiled in
+
+ AC_MSG_CHECKING(for ffmpeg swscale support)
+ saved_LIBS="$LIBS"
+ LIBS="$saved_LIBS $FFMPEG_TEMP_LIBS"
+ AC_TRY_LINK([#include <libavcodec/avcodec.h>],
+         [img_convert(0, 0, 0,0,0,0)],
+         enable_ffmpeg_swscale=no,enable_ffmpeg_swscale=yes)
+ LIBS="$saved_LIBS"
+ AC_MSG_RESULT($enable_ffmpeg_swscale)
+ if test x"$enable_ffmpeg_swscale" == xyes; then
+     dnl AC_DEFINE(HAVE_SWSCALER)
+     PKG_CHECK_MODULES([FFMPEG], [libavcodec libpostproc libswscale])
+     FFMPEG_CFLAGS="$FFMPEG_CFLAGS -I/usr/include/libavcodec -I/usr/include/libswscale -DHAVE_SWSCALER"
+ else
+     PKG_CHECK_MODULES([FFMPEG], [libavcodec libpostproc])
+ fi
+ FFMPEG_EXTERNALTEXT="External ffmpeg"
else
FFMPEG_FOLDER=ffmpeg
FFMPEG_CFLAGS="-I\$(top_srcdir)/quicktime/ffmpeg/libavcodec"
Index: cinelerra/ffmpeg.C
===================================================================
--- cinelerra/ffmpeg.C    (revision 1055)
+++ cinelerra/ffmpeg.C    (working copy)
@@ -5,6 +5,7 @@
#include "ffmpeg.h"
#include "guicast.h"

+
FFMPEG::FFMPEG(Asset *asset) {
    this->asset = asset;
    codec = 0;
@@ -139,23 +140,49 @@
        color_model_to_pix_fmt(frame_in->get_color_model());
    PixelFormat pix_fmt_out =
        color_model_to_pix_fmt(frame_out->get_color_model());
-
+#ifdef HAVE_SWSCALER
+    // We need a context for swscale
+    struct SwsContext *convert_ctx;
+#endif
    // do conversion within libavcodec if possible
    if (pix_fmt_in != PIX_FMT_NB && pix_fmt_out != PIX_FMT_NB) {
        // set up a temporary pictures from frame_in and frame_out
        AVPicture picture_in, picture_out;
        init_picture_from_frame(&picture_in, frame_in);
        init_picture_from_frame(&picture_out, frame_out);
-
-        int result = img_convert(&picture_out,
-                     pix_fmt_out,
-                     &picture_in,
-                     pix_fmt_in,
-                     frame_in->get_w(),
-                     frame_out->get_h());
+        int result;
+#ifndef HAVE_SWSCALER
+        result = img_convert(&picture_out,
+                 pix_fmt_out,
+                 &picture_in,
+                 pix_fmt_in,
+                 frame_in->get_w(),
+                 frame_out->get_h());
        if (result) {
            printf("FFMPEG::convert_cmodel img_convert() failed\n");
        }
+#else
+        convert_ctx = sws_getContext(frame_in->get_w(), frame_in->get_h(),pix_fmt_in,
+                frame_out->get_w(),frame_out->get_h(),pix_fmt_out,
+                SWS_BICUBIC, NULL, NULL, NULL);
+
+        if(convert_ctx == NULL){
+            printf("FFMPEG::convert_cmodel : swscale context initialization failed\n");
+            return 1;
+        }
+
+        result = sws_scale(convert_ctx,
+                picture_in.data, picture_in.linesize,
+                frame_in->get_w(), frame_in->get_h(),
+                picture_out.data, picture_out.linesize);
+
+    
+        sws_freeContext(convert_ctx);
+
+        if(result){
+            printf("FFMPEG::convert_cmodel sws_scale() failed\n");
+        }
+#endif
        return result;
    }

@@ -207,20 +234,48 @@
    int cmodel_out = frame_out->get_color_model();
    PixelFormat pix_fmt_out = color_model_to_pix_fmt(cmodel_out);

+#ifdef HAVE_SWSCALER
+    // We need a context for swscale
+    struct SwsContext *convert_ctx;
+#endif
+    int result;
+#ifndef HAVE_SWSCALER
    // do conversion within libavcodec if possible
    if (pix_fmt_out != PIX_FMT_NB) {
-        int result = img_convert(&picture_out,
-                     pix_fmt_out,
-                     picture_in,
-                     pix_fmt_in,
-                     width_in,
-                     height_in);
+        result = img_convert(&picture_out,
+                 pix_fmt_out,
+                 picture_in,
+                 pix_fmt_in,
+                 width_in,
+                 height_in);
        if (result) {
            printf("FFMPEG::convert_cmodel img_convert() failed\n");
        }
        return result;
    }
+#else
+    convert_ctx = sws_getContext(width_in, height_in,pix_fmt_in,
+                 frame_out->get_w(),frame_out->get_h(),pix_fmt_out,
+                 SWS_BICUBIC, NULL, NULL, NULL);
+
+    if(convert_ctx == NULL){
+     printf("FFMPEG::convert_cmodel : swscale context initialization failed\n");
+     return 1;
+    }
+
+    result = sws_scale(convert_ctx,
+             picture_in->data, picture_in->linesize,
+             width_in, height_in,
+             picture_out.data, picture_out.linesize);
+
    
+        sws_freeContext(convert_ctx);
+
+        if(result){
+            printf("FFMPEG::convert_cmodel sws_scale() failed\n");
+        }
+#endif
+    
    // make an intermediate temp frame only if necessary
    int cmodel_in = pix_fmt_to_color_model(pix_fmt_in);
    if (cmodel_in == BC_TRANSPARENCY) {
Index: cinelerra/ffmpeg.h
===================================================================
--- cinelerra/ffmpeg.h    (revision 1055)
+++ cinelerra/ffmpeg.h    (working copy)
@@ -3,8 +3,14 @@

extern "C" {
#include <avcodec.h>
-};
+}

+#ifdef HAVE_SWSCALER
+extern "C" {
+#include <swscale.h>
+}
+#endif
+
#include "asset.h"
#include "guicast.h"