diff options
author | Benjamin Otte <otte@gnome.org> | 2007-06-26 12:29:42 +0200 |
---|---|---|
committer | Benjamin Otte <otte@gnome.org> | 2007-06-26 12:29:42 +0200 |
commit | ed66672b6bd13a613aaf875d2f898cc2f16a47b9 (patch) | |
tree | 30628b16a166693ccf13ea1daaf4b60a9bb3b5f8 | |
parent | 8e04b92f5880361d5a34ad4f6674de3c88ad4377 (diff) |
update the ffmpeg code to something newer than Debian stable
-rw-r--r-- | libswfdec/swfdec_codec_ffmpeg.c | 20 |
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); |