summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@gnome.org>2007-06-26 12:29:42 +0200
committerBenjamin Otte <otte@gnome.org>2007-06-26 12:29:42 +0200
commited66672b6bd13a613aaf875d2f898cc2f16a47b9 (patch)
tree30628b16a166693ccf13ea1daaf4b60a9bb3b5f8
parent8e04b92f5880361d5a34ad4f6674de3c88ad4377 (diff)
update the ffmpeg code to something newer than Debian stable
-rw-r--r--libswfdec/swfdec_codec_ffmpeg.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/libswfdec/swfdec_codec_ffmpeg.c b/libswfdec/swfdec_codec_ffmpeg.c
index 8f333e8e..5dc8f3c1 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 (SwfdecAudioDecoder *dec, SwfdecBuffer *buffer)
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 (SwfdecVideoDecoder *dec, SwfdecBuffer *buffe
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 (SwfdecVideoDecoder *dec)
{
SwfdecVideoDecoderFFMpeg *codec = (SwfdecVideoDecoderFFMpeg *) dec;
+ if (codec->sws) {
+ sws_freeContext (codec->sws);
+ };
avcodec_close (codec->ctx);
av_free (codec->ctx);
av_free (codec->frame);