summaryrefslogtreecommitdiffstats
path: root/libmpcodecs
diff options
context:
space:
mode:
authorUoti Urpala <uau@mplayer2.org>2012-01-28 13:41:36 +0200
committerUoti Urpala <uau@mplayer2.org>2012-02-01 22:46:27 +0200
commitdb8cdc73e38c3490389212d94ae9b92dfddd5975 (patch)
treeee6486888b90afe0e5a42a8e0c080366f5c8a7e5 /libmpcodecs
parent637d6b7c8e12b4f71ccbc64f73a402b573e71697 (diff)
downloadmpv-db8cdc73e38c3490389212d94ae9b92dfddd5975.tar.bz2
mpv-db8cdc73e38c3490389212d94ae9b92dfddd5975.tar.xz
Update Libav API uses
Change various code to use the latest Libav API. The libavcodec error_recognition setting has been removed and replaced with different semantics. I removed the "--lavdopts=er=<value>" option accordingly, as I don't think it's widely enough used to be worth attempting to emulate the old option semantics using the new API. A new option with the new semantics can be added later if needed. Libav dropped APIs that were necessary with all Libav versions until quite recently (like setting avctx->age), and it would thus not be possible to keep compatibility with previous Libav versions without adding workarounds. The new APIs also had some bugs/limitations in the recent Libav release 0.8, and it would not work fully (at least some avcodec options would not be set correctly). Because of those issues, this commit makes no attempt to maintain compatibility with anything but the latest Libav git head. Hopefully the required fixes and improvements will be included in a following Libav point release.
Diffstat (limited to 'libmpcodecs')
-rw-r--r--libmpcodecs/ad_ffmpeg.c27
-rw-r--r--libmpcodecs/vd_ffmpeg.c36
-rw-r--r--libmpcodecs/vf_lavc.c4
-rw-r--r--libmpcodecs/vf_uspp.c7
4 files changed, 30 insertions, 44 deletions
diff --git a/libmpcodecs/ad_ffmpeg.c b/libmpcodecs/ad_ffmpeg.c
index cd742cf8f8..4a5062ba00 100644
--- a/libmpcodecs/ad_ffmpeg.c
+++ b/libmpcodecs/ad_ffmpeg.c
@@ -23,6 +23,7 @@
#include <assert.h>
#include <libavcodec/avcodec.h>
+#include <libavutil/opt.h>
#include "talloc.h"
@@ -67,10 +68,10 @@ static int setup_format(sh_audio_t *sh_audio,
{
int sample_format = sh_audio->sample_format;
switch (lavc_context->sample_fmt) {
- case SAMPLE_FMT_U8: sample_format = AF_FORMAT_U8; break;
- case SAMPLE_FMT_S16: sample_format = AF_FORMAT_S16_NE; break;
- case SAMPLE_FMT_S32: sample_format = AF_FORMAT_S32_NE; break;
- case SAMPLE_FMT_FLT: sample_format = AF_FORMAT_FLOAT_NE; break;
+ case AV_SAMPLE_FMT_U8: sample_format = AF_FORMAT_U8; break;
+ case AV_SAMPLE_FMT_S16: sample_format = AF_FORMAT_S16_NE; break;
+ case AV_SAMPLE_FMT_S32: sample_format = AF_FORMAT_S32_NE; break;
+ case AV_SAMPLE_FMT_FLT: sample_format = AF_FORMAT_FLOAT_NE; break;
default:
mp_msg(MSGT_DECAUDIO, MSGL_FATAL, "Unsupported sample format\n");
}
@@ -119,10 +120,12 @@ static int init(sh_audio_t *sh_audio)
struct priv *ctx = talloc_zero(NULL, struct priv);
sh_audio->context = ctx;
- lavc_context = avcodec_alloc_context();
+ lavc_context = avcodec_alloc_context3(lavc_codec);
ctx->avctx = lavc_context;
- lavc_context->drc_scale = opts->drc_level;
+ // Always try to set - option only exists for AC3 at the moment
+ av_opt_set_double(lavc_context, "drc_scale", opts->drc_level,
+ AV_OPT_SEARCH_CHILDREN);
lavc_context->sample_rate = sh_audio->samplerate;
lavc_context->bit_rate = sh_audio->i_bps * 8;
if (sh_audio->wf) {
@@ -156,7 +159,7 @@ static int init(sh_audio_t *sh_audio)
}
/* open it */
- if (avcodec_open(lavc_context, lavc_codec) < 0) {
+ if (avcodec_open2(lavc_context, lavc_codec, NULL) < 0) {
mp_tmsg(MSGT_DECAUDIO, MSGL_ERR, "Could not open codec.\n");
uninit(sh_audio);
return 0;
@@ -195,10 +198,10 @@ static int init(sh_audio_t *sh_audio)
sh_audio->i_bps = sh_audio->wf->nAvgBytesPerSec;
switch (lavc_context->sample_fmt) {
- case SAMPLE_FMT_U8:
- case SAMPLE_FMT_S16:
- case SAMPLE_FMT_S32:
- case SAMPLE_FMT_FLT:
+ case AV_SAMPLE_FMT_U8:
+ case AV_SAMPLE_FMT_S16:
+ case AV_SAMPLE_FMT_S32:
+ case AV_SAMPLE_FMT_FLT:
break;
default:
uninit(sh_audio);
@@ -215,7 +218,7 @@ static void uninit(sh_audio_t *sh)
AVCodecContext *lavc_context = ctx->avctx;
if (lavc_context) {
- if (lavc_context->codec && avcodec_close(lavc_context) < 0)
+ if (avcodec_close(lavc_context) < 0)
mp_tmsg(MSGT_DECVIDEO, MSGL_ERR, "Could not close codec.\n");
av_freep(&lavc_context->extradata);
av_freep(&lavc_context);
diff --git a/libmpcodecs/vd_ffmpeg.c b/libmpcodecs/vd_ffmpeg.c
index 0688aae7cc..cd59b05e79 100644
--- a/libmpcodecs/vd_ffmpeg.c
+++ b/libmpcodecs/vd_ffmpeg.c
@@ -22,13 +22,15 @@
#include <time.h>
#include <stdbool.h>
+#include <libavutil/common.h>
+#include <libavutil/opt.h>
+
#include "talloc.h"
#include "config.h"
#include "mp_msg.h"
#include "options.h"
#include "av_opts.h"
-#include "libavutil/common.h"
#include "ffmpeg_files/intreadwrite.h"
#include "mpbswap.h"
#include "fmt-conversion.h"
@@ -62,8 +64,6 @@ typedef struct {
int do_dr1;
int vo_initialized;
int best_csp;
- int b_age;
- int ip_age[2];
int qp_stat[32];
double qp_sum;
double inv_qp_sum;
@@ -86,7 +86,6 @@ static void uninit(struct sh_video *sh);
const m_option_t lavc_decode_opts_conf[] = {
OPT_INTRANGE("bug", lavc_param.workaround_bugs, 0, -1, 999999),
- OPT_INTRANGE("er", lavc_param.error_resilience, 0, 0, 99),
OPT_FLAG_ON("gray", lavc_param.gray, 0),
OPT_INTRANGE("idct", lavc_param.idct_algo, 0, 0, 99),
OPT_INTRANGE("ec", lavc_param.error_concealment, 0, 0, 99),
@@ -149,11 +148,10 @@ static int init(sh_video_t *sh)
&& lavc_codec->id != CODEC_ID_ROQ && lavc_codec->id != CODEC_ID_VP8
&& lavc_codec->id != CODEC_ID_LAGARITH)
ctx->do_dr1 = 1;
- ctx->b_age = ctx->ip_age[0] = ctx->ip_age[1] = 256 * 256 * 256 * 64;
ctx->ip_count = ctx->b_count = 0;
ctx->pic = avcodec_alloc_frame();
- ctx->avctx = avcodec_alloc_context();
+ ctx->avctx = avcodec_alloc_context3(lavc_codec);
avctx = ctx->avctx;
avctx->opaque = sh;
avctx->codec_type = AVMEDIA_TYPE_VIDEO;
@@ -209,7 +207,6 @@ static int init(sh_video_t *sh)
avctx->coded_width = sh->disp_w;
avctx->coded_height = sh->disp_h;
avctx->workaround_bugs = lavc_param->workaround_bugs;
- avctx->error_recognition = lavc_param->error_resilience;
if (lavc_param->gray)
avctx->flags |= CODEC_FLAG_GRAY;
avctx->flags2 |= lavc_param->fast;
@@ -272,7 +269,7 @@ static int init(sh_video_t *sh)
* MJPG fourcc :( */
if (!sh->bih || sh->bih->biSize <= sizeof(*sh->bih))
break;
- avctx->flags |= CODEC_FLAG_EXTERN_HUFF;
+ av_opt_set_int(avctx, "extern_huff", 1, AV_OPT_SEARCH_CHILDREN);
avctx->extradata_size = sh->bih->biSize - sizeof(*sh->bih);
avctx->extradata = av_mallocz(avctx->extradata_size +
FF_INPUT_BUFFER_PADDING_SIZE);
@@ -318,7 +315,7 @@ static int init(sh_video_t *sh)
avctx->thread_count = lavc_param->threads;
/* open it */
- if (avcodec_open(avctx, lavc_codec) < 0) {
+ if (avcodec_open2(avctx, lavc_codec, NULL) < 0) {
mp_tmsg(MSGT_DECVIDEO, MSGL_ERR, "Could not open codec.\n");
uninit(sh);
return 0;
@@ -550,19 +547,6 @@ static int get_buffer(AVCodecContext *avctx, AVFrame *pic)
pic->opaque = mpi;
- if (pic->reference) {
- pic->age = ctx->ip_age[0];
-
- ctx->ip_age[0] = ctx->ip_age[1] + 1;
- ctx->ip_age[1] = 1;
- ctx->b_age++;
- } else {
- pic->age = ctx->b_age;
-
- ctx->ip_age[0]++;
- ctx->ip_age[1]++;
- ctx->b_age = 1;
- }
pic->type = FF_BUFFER_TYPE_USER;
/* The libavcodec reordered_opaque functionality is implemented by
@@ -708,16 +692,16 @@ static struct mp_image *decode(struct sh_video *sh, struct demux_packet *packet,
all_frametime, (double)(len * 8) / sh->frametime / 1000.0,
(double)(all_len * 8) / all_frametime / 1000.0);
switch (pic->pict_type) {
- case FF_I_TYPE:
+ case AV_PICTURE_TYPE_I:
fprintf(fvstats, "type= I\n");
break;
- case FF_P_TYPE:
+ case AV_PICTURE_TYPE_P:
fprintf(fvstats, "type= P\n");
break;
- case FF_S_TYPE:
+ case AV_PICTURE_TYPE_S:
fprintf(fvstats, "type= S\n");
break;
- case FF_B_TYPE:
+ case AV_PICTURE_TYPE_B:
fprintf(fvstats, "type= B\n");
break;
default:
diff --git a/libmpcodecs/vf_lavc.c b/libmpcodecs/vf_lavc.c
index ba870a8b85..b2c1dd756d 100644
--- a/libmpcodecs/vf_lavc.c
+++ b/libmpcodecs/vf_lavc.c
@@ -71,7 +71,7 @@ static int config(struct vf_instance *vf,
vf->priv->outbuf_size=10000+width*height; // must be enough!
vf->priv->outbuf = malloc(vf->priv->outbuf_size);
- if (avcodec_open(&lavc_venc_context, vf->priv->codec) != 0) {
+ if (avcodec_open2(&lavc_venc_context, vf->priv->codec, NULL) != 0) {
mp_tmsg(MSGT_VFILTER,MSGL_ERR,"Could not open codec.\n");
return 0;
}
@@ -143,7 +143,7 @@ static int vf_open(vf_instance_t *vf, char *args){
return 0;
}
- vf->priv->context=avcodec_alloc_context();
+ vf->priv->context=avcodec_alloc_context3(vf->priv->codec);
vf->priv->pic = avcodec_alloc_frame();
// TODO: parse args ->
diff --git a/libmpcodecs/vf_uspp.c b/libmpcodecs/vf_uspp.c
index 332d59ee22..ae044b19a6 100644
--- a/libmpcodecs/vf_uspp.c
+++ b/libmpcodecs/vf_uspp.c
@@ -222,8 +222,7 @@ static int config(struct vf_instance *vf,
for(i=0; i< (1<<vf->priv->log2_count); i++){
AVCodecContext *avctx_enc;
- avctx_enc=
- vf->priv->avctx_enc[i]= avcodec_alloc_context();
+ avctx_enc = vf->priv->avctx_enc[i] = avcodec_alloc_context3(enc);
avctx_enc->width = width + BLOCK;
avctx_enc->height = height + BLOCK;
avctx_enc->time_base= (AVRational){1,25}; // meaningless
@@ -233,8 +232,8 @@ static int config(struct vf_instance *vf,
avctx_enc->flags = CODEC_FLAG_QSCALE | CODEC_FLAG_LOW_DELAY;
avctx_enc->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
avctx_enc->global_quality= 123;
- avcodec_open(avctx_enc, enc);
- assert(avctx_enc->codec);
+ int res = avcodec_open2(avctx_enc, enc, NULL);
+ assert(res >= 0);
}
vf->priv->frame= avcodec_alloc_frame();
vf->priv->frame_dec= avcodec_alloc_frame();