libswfdec/swfdec_codec_ffmpeg.c | 23 +++++++++++++++++++----
1 files changed, 19 insertions(+), 4 deletions(-)
New commits:
diff-tree 27f2f8fe232d392ddf50e97116724f507cc05a43 (from
ed66672b6bd13a613aaf875d2f898cc2f16a47b9)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue Jun 26 12:32:15 2007 +0200
add support for VP6 to ffmpeg
diff --git a/libswfdec/swfdec_codec_ffmpeg.c b/libswfdec/swfdec_codec_ffmpeg.c
index 5dc8f3c..8b7463c 100644
--- a/libswfdec/swfdec_codec_ffmpeg.c
+++ b/libswfdec/swfdec_codec_ffmpeg.c
@@ -270,6 +270,9 @@ swfdec_video_decoder_ffmpeg_new (SwfdecV
case SWFDEC_VIDEO_FORMAT_SCREEN:
id = CODEC_ID_FLASHSV;
break;
+ case SWFDEC_VIDEO_FORMAT_VP6:
+ id = CODEC_ID_VP6F;
+ break;
default:
return NULL;
}
diff-tree ed66672b6bd13a613aaf875d2f898cc2f16a47b9 (from
8e04b92f5880361d5a34ad4f6674de3c88ad4377)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue Jun 26 12:29:42 2007 +0200
update the ffmpeg code to something newer than Debian stable
diff --git a/libswfdec/swfdec_codec_ffmpeg.c b/libswfdec/swfdec_codec_ffmpeg.c
index 8f333e8..5dc8f3c 100644
--- a/libswfdec/swfdec_codec_ffmpeg.c
+++ b/libswfdec/swfdec_codec_ffmpeg.c
@@ -22,6 +22,7 @@
#endif
#include <string.h>
#include <avcodec.h>
+#include <swscale.h>
#include "swfdec_codec_audio.h"
#include "swfdec_codec_video.h"
@@ -124,7 +125,7 @@ swfdec_audio_decoder_ffmpeg_push (Swfdec
outbuf = swfdec_buffer_new_and_alloc (AVCODEC_MAX_AUDIO_FRAME_SIZE);
for (amount = 0; amount < buffer->length; amount += len) {
- len = avcodec_decode_audio (ffmpeg->ctx, (short *) outbuf->data,
&out_size, buffer->data + amount, buffer->length - amount);
+ len = avcodec_decode_audio2 (ffmpeg->ctx, (short *) outbuf->data,
&out_size, buffer->data + amount, buffer->length - amount);
if (len < 0) {
SWFDEC_ERROR ("Error %d while decoding", len);
@@ -205,6 +206,7 @@ typedef struct {
SwfdecVideoDecoder decoder;
AVCodecContext * ctx; /* out context (d'oh) */
AVFrame * frame; /* the frame we use for decoding */
+ struct SwsContext * sws; /* the format conversion */
} SwfdecVideoDecoderFFMpeg;
SwfdecBuffer *
@@ -221,12 +223,19 @@ swfdec_video_decoder_ffmpeg_decode (Swfd
SWFDEC_WARNING ("error decoding frame");
return NULL;
}
+ if (codec->sws == NULL) {
+ codec->sws = sws_getContext (codec->ctx->width,
codec->ctx->height, codec->ctx->pix_fmt,
+ codec->ctx->width, codec->ctx->height, PIX_FMT_RGB32, 0, NULL,
NULL, NULL);
+ if (codec->sws == NULL) {
+ SWFDEC_ERROR ("Could not get conversion context");
+ return NULL;
+ }
+ }
ret = swfdec_buffer_new_and_alloc (codec->ctx->width *
codec->ctx->height * 4);
avpicture_fill (&picture, ret->data, PIX_FMT_RGB32,
codec->ctx->width,
codec->ctx->height);
- img_convert (&picture, PIX_FMT_RGB32,
- (AVPicture *) codec->frame, codec->ctx->pix_fmt,
- codec->ctx->width, codec->ctx->height);
+ sws_scale (codec->sws, codec->frame->data,
codec->frame->linesize, 0, codec->ctx->height,
+ picture.data, picture.linesize);
*width = codec->ctx->width;
*height = codec->ctx->height;
*rowstride = codec->ctx->width * 4;
@@ -238,6 +247,9 @@ swfdec_video_decoder_ffmpeg_free (Swfdec
{
SwfdecVideoDecoderFFMpeg *codec = (SwfdecVideoDecoderFFMpeg *) dec;
+ if (codec->sws) {
+ sws_freeContext (codec->sws);
+ };
avcodec_close (codec->ctx);
av_free (codec->ctx);
av_free (codec->frame);