thanks for testing it adrian! I'd like to push in the svn the swscale ffmpeg code you did. well, no one gave any feedback, so I think the patch is ok. btw, I'm attaching it again for review.
bye, rafael diniz Em Tuesday 01 April 2008, Adrian Prantl escreveu: > Am 31.03.2008 um 05:46 schrieb rafael2k: > > I just (re)made a svn diff for the current svn release - 1055, of > > the darwin > > patch (macos x support): > > http://juba.tvlivre.org/patch-leo.diff > > good job! > > > ps: I have no way to test it, because I could not set up my darwin > > environment > > yet. > > I tried it out on my machine (Intel/OS 10.5.2), and it seems to build > just fine. -- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- 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"
signature.asc
Description: This is a digitally signed message part.
