Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 14 Apr 2016 12:15:21 +0000 (UTC)
From:      "Carlos J. Puga Medina" <cpm@FreeBSD.org>
To:        ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org
Subject:   svn commit: r413260 - in head/multimedia/mpv: . files
Message-ID:  <201604141215.u3ECFMPU071627@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: cpm
Date: Thu Apr 14 12:15:21 2016
New Revision: 413260
URL: https://svnweb.freebsd.org/changeset/ports/413260

Log:
  - Backport patches to fix enconding support
  - Fix pkg-plist
  - Bump PORTREVISION
  
  Reported by:	jbeich
  Approved by:	junovitch (mentor)

Added:
  head/multimedia/mpv/files/patch-audio_out_ao__lavc.c   (contents, props changed)
  head/multimedia/mpv/files/patch-common_encode__lavc.c   (contents, props changed)
  head/multimedia/mpv/files/patch-common_encode__lavc.h   (contents, props changed)
  head/multimedia/mpv/files/patch-video_out_vo__lavc.c   (contents, props changed)
  head/multimedia/mpv/files/patch-wscript   (contents, props changed)
Modified:
  head/multimedia/mpv/Makefile
  head/multimedia/mpv/pkg-plist

Modified: head/multimedia/mpv/Makefile
==============================================================================
--- head/multimedia/mpv/Makefile	Thu Apr 14 11:12:31 2016	(r413259)
+++ head/multimedia/mpv/Makefile	Thu Apr 14 12:15:21 2016	(r413260)
@@ -4,6 +4,7 @@
 PORTNAME=	mpv
 PORTVERSION=	0.17.0
 DISTVERSIONPREFIX=	v
+PORTREVISION=	1
 PORTEPOCH=	1
 CATEGORIES=	multimedia audio
 

Added: head/multimedia/mpv/files/patch-audio_out_ao__lavc.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/multimedia/mpv/files/patch-audio_out_ao__lavc.c	Thu Apr 14 12:15:21 2016	(r413260)
@@ -0,0 +1,209 @@
+--- audio/out/ao_lavc.c.orig	2016-04-11 17:10:54 UTC
++++ audio/out/ao_lavc.c
+@@ -42,6 +42,7 @@ struct priv {
+     uint8_t *buffer;
+     size_t buffer_size;
+     AVStream *stream;
++    AVCodecContext *codec;
+     int pcmhack;
+     int aframesize;
+     int aframecount;
+@@ -98,15 +99,14 @@ static int init(struct ao *ao)
+ 
+     pthread_mutex_lock(&ao->encode_lavc_ctx->lock);
+ 
+-    ac->stream = encode_lavc_alloc_stream(ao->encode_lavc_ctx,
+-                                          AVMEDIA_TYPE_AUDIO);
+-
+-    if (!ac->stream) {
+-        MP_ERR(ao, "could not get a new audio stream\n");
+-        goto fail;
++    if (encode_lavc_alloc_stream(ao->encode_lavc_ctx,
++                                 AVMEDIA_TYPE_AUDIO,
++                                 &ac->stream, &ac->codec) < 0) {
++      MP_ERR(ao, "could not get a new audio stream\n");
++      goto fail;
+     }
+ 
+-    codec = encode_lavc_get_codec(ao->encode_lavc_ctx, ac->stream);
++    codec = ao->encode_lavc_ctx->ac;
+ 
+     int samplerate = af_select_best_samplerate(ao->samplerate,
+                                                codec->supported_samplerates);
+@@ -118,40 +118,40 @@ static int init(struct ao *ao)
+     // Using codec->time_bvase is deprecated, but needed for older lavf.
+     ac->stream->time_base.num = 1;
+     ac->stream->time_base.den = ao->samplerate;
+-    ac->stream->codec->time_base.num = 1;
+-    ac->stream->codec->time_base.den = ao->samplerate;
++    ac->codec->time_base.num = 1;
++    ac->codec->time_base.den = ao->samplerate;
+ 
+-    ac->stream->codec->sample_rate = ao->samplerate;
++    ac->codec->sample_rate = ao->samplerate;
+ 
+     struct mp_chmap_sel sel = {0};
+     mp_chmap_sel_add_any(&sel);
+     if (!ao_chmap_sel_adjust(ao, &sel, &ao->channels))
+         goto fail;
+     mp_chmap_reorder_to_lavc(&ao->channels);
+-    ac->stream->codec->channels = ao->channels.num;
+-    ac->stream->codec->channel_layout = mp_chmap_to_lavc(&ao->channels);
++    ac->codec->channels = ao->channels.num;
++    ac->codec->channel_layout = mp_chmap_to_lavc(&ao->channels);
+ 
+-    ac->stream->codec->sample_fmt = AV_SAMPLE_FMT_NONE;
++    ac->codec->sample_fmt = AV_SAMPLE_FMT_NONE;
+ 
+     select_format(ao, codec);
+ 
+     ac->sample_size = af_fmt_to_bytes(ao->format);
+-    ac->stream->codec->sample_fmt = af_to_avformat(ao->format);
+-    ac->stream->codec->bits_per_raw_sample = ac->sample_size * 8;
++    ac->codec->sample_fmt = af_to_avformat(ao->format);
++    ac->codec->bits_per_raw_sample = ac->sample_size * 8;
+ 
+-    if (encode_lavc_open_codec(ao->encode_lavc_ctx, ac->stream) < 0)
++    if (encode_lavc_open_codec(ao->encode_lavc_ctx, ac->codec) < 0)
+         goto fail;
+ 
+     ac->pcmhack = 0;
+-    if (ac->stream->codec->frame_size <= 1)
+-        ac->pcmhack = av_get_bits_per_sample(ac->stream->codec->codec_id) / 8;
++    if (ac->codec->frame_size <= 1)
++        ac->pcmhack = av_get_bits_per_sample(ac->codec->codec_id) / 8;
+ 
+     if (ac->pcmhack) {
+         ac->aframesize = 16384; // "enough"
+         ac->buffer_size =
+             ac->aframesize * ac->pcmhack * ao->channels.num * 2 + 200;
+     } else {
+-        ac->aframesize = ac->stream->codec->frame_size;
++        ac->aframesize = ac->codec->frame_size;
+         ac->buffer_size =
+             ac->aframesize * ac->sample_size * ao->channels.num * 2 + 200;
+     }
+@@ -203,7 +203,7 @@ static void uninit(struct ao *ao)
+         double outpts = ac->expected_next_pts;
+         if (!ectx->options->rawts && ectx->options->copyts)
+             outpts += ectx->discontinuity_pts_offset;
+-        outpts += encode_lavc_getoffset(ectx, ac->stream);
++        outpts += encode_lavc_getoffset(ectx, ac->codec);
+         while (encode(ao, outpts, NULL) > 0) ;
+     }
+ 
+@@ -252,25 +252,25 @@ static int encode(struct ao *ao, double 
+ 
+         if (ectx->options->rawts || ectx->options->copyts) {
+             // real audio pts
+-            frame->pts = floor(apts * ac->stream->codec->time_base.den / ac->stream->codec->time_base.num + 0.5);
++            frame->pts = floor(apts * ac->codec->time_base.den / ac->codec->time_base.num + 0.5);
+         } else {
+             // audio playback time
+-            frame->pts = floor(realapts * ac->stream->codec->time_base.den / ac->stream->codec->time_base.num + 0.5);
++            frame->pts = floor(realapts * ac->codec->time_base.den / ac->codec->time_base.num + 0.5);
+         }
+ 
+-        int64_t frame_pts = av_rescale_q(frame->pts, ac->stream->codec->time_base, ac->worst_time_base);
++        int64_t frame_pts = av_rescale_q(frame->pts, ac->codec->time_base, ac->worst_time_base);
+         if (ac->lastpts != AV_NOPTS_VALUE && frame_pts <= ac->lastpts) {
+             // this indicates broken video
+             // (video pts failing to increase fast enough to match audio)
+             MP_WARN(ao, "audio frame pts went backwards (%d <- %d), autofixed\n",
+                     (int)frame->pts, (int)ac->lastpts);
+             frame_pts = ac->lastpts + 1;
+-            frame->pts = av_rescale_q(frame_pts, ac->worst_time_base, ac->stream->codec->time_base);
++            frame->pts = av_rescale_q(frame_pts, ac->worst_time_base, ac->codec->time_base);
+         }
+         ac->lastpts = frame_pts;
+ 
+-        frame->quality = ac->stream->codec->global_quality;
+-        status = avcodec_encode_audio2(ac->stream->codec, &packet, frame, &gotpacket);
++        frame->quality = ac->codec->global_quality;
++        status = avcodec_encode_audio2(ac->codec, &packet, frame, &gotpacket);
+ 
+         if (!status) {
+             if (ac->savepts == AV_NOPTS_VALUE)
+@@ -281,7 +281,7 @@ static int encode(struct ao *ao, double 
+     }
+     else
+     {
+-        status = avcodec_encode_audio2(ac->stream->codec, &packet, NULL, &gotpacket);
++        status = avcodec_encode_audio2(ac->codec, &packet, NULL, &gotpacket);
+     }
+ 
+     if(status) {
+@@ -295,7 +295,7 @@ static int encode(struct ao *ao, double 
+     MP_DBG(ao, "got pts %f (playback time: %f); out size: %d\n",
+            apts, realapts, packet.size);
+ 
+-    encode_lavc_write_stats(ao->encode_lavc_ctx, ac->stream);
++    encode_lavc_write_stats(ao->encode_lavc_ctx, ac->codec);
+ 
+     packet.stream_index = ac->stream->index;
+ 
+@@ -307,20 +307,20 @@ static int encode(struct ao *ao, double 
+     }
+ 
+     if (packet.pts != AV_NOPTS_VALUE)
+-        packet.pts = av_rescale_q(packet.pts, ac->stream->codec->time_base,
++        packet.pts = av_rescale_q(packet.pts, ac->codec->time_base,
+                 ac->stream->time_base);
+ 
+     if (packet.dts != AV_NOPTS_VALUE)
+-        packet.dts = av_rescale_q(packet.dts, ac->stream->codec->time_base,
++        packet.dts = av_rescale_q(packet.dts, ac->codec->time_base,
+                 ac->stream->time_base);
+ 
+     if(packet.duration > 0)
+-        packet.duration = av_rescale_q(packet.duration, ac->stream->codec->time_base,
++        packet.duration = av_rescale_q(packet.duration, ac->codec->time_base,
+                 ac->stream->time_base);
+ 
+     ac->savepts = AV_NOPTS_VALUE;
+ 
+-    if (encode_lavc_write_frame(ao->encode_lavc_ctx, &packet) < 0) {
++    if (encode_lavc_write_frame(ao->encode_lavc_ctx, ac->stream, &packet) < 0) {
+         MP_ERR(ao, "error writing at %f %f/%f\n",
+                realapts, (double) ac->stream->time_base.num,
+                (double) ac->stream->time_base.den);
+@@ -377,22 +377,22 @@ static int play(struct ao *ao, void **da
+     }
+ 
+     if (ac->worst_time_base.den == 0) {
+-        //if (ac->stream->codec->time_base.num / ac->stream->codec->time_base.den >= ac->stream->time_base.num / ac->stream->time_base.den)
+-        if (ac->stream->codec->time_base.num * (double) ac->stream->time_base.den >=
+-                ac->stream->time_base.num * (double) ac->stream->codec->time_base.den) {
++        //if (ac->codec->time_base.num / ac->codec->time_base.den >= ac->stream->time_base.num / ac->stream->time_base.den)
++        if (ac->codec->time_base.num * (double) ac->stream->time_base.den >=
++                ac->stream->time_base.num * (double) ac->codec->time_base.den) {
+             MP_VERBOSE(ao, "NOTE: using codec time base (%d/%d) for pts "
+                        "adjustment; the stream base (%d/%d) is not worse.\n",
+-                       (int)ac->stream->codec->time_base.num,
+-                       (int)ac->stream->codec->time_base.den,
++                       (int)ac->codec->time_base.num,
++                       (int)ac->codec->time_base.den,
+                        (int)ac->stream->time_base.num,
+                        (int)ac->stream->time_base.den);
+-            ac->worst_time_base = ac->stream->codec->time_base;
++            ac->worst_time_base = ac->codec->time_base;
+             ac->worst_time_base_is_stream = 0;
+         } else {
+             MP_WARN(ao, "NOTE: not using codec time base (%d/%d) for pts "
+                     "adjustment; the stream base (%d/%d) is worse.\n",
+-                    (int)ac->stream->codec->time_base.num,
+-                    (int)ac->stream->codec->time_base.den,
++                    (int)ac->codec->time_base.num,
++                    (int)ac->codec->time_base.den,
+                     (int)ac->stream->time_base.num,
+                     (int)ac->stream->time_base.den);
+             ac->worst_time_base = ac->stream->time_base;
+@@ -437,7 +437,7 @@ static int play(struct ao *ao, void **da
+     }
+ 
+     // Shift pts by the pts offset first.
+-    outpts += encode_lavc_getoffset(ectx, ac->stream);
++    outpts += encode_lavc_getoffset(ectx, ac->codec);
+ 
+     while (samples - bufpos >= ac->aframesize) {
+         void *start[MP_NUM_CHANNELS] = {0};

Added: head/multimedia/mpv/files/patch-common_encode__lavc.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/multimedia/mpv/files/patch-common_encode__lavc.c	Thu Apr 14 12:15:21 2016	(r413260)
@@ -0,0 +1,569 @@
+--- common/encode_lavc.c.orig	2016-04-11 17:10:54 UTC
++++ common/encode_lavc.c
+@@ -21,6 +21,7 @@
+ 
+ #include <libavutil/avutil.h>
+ 
++#include "config.h"
+ #include "encode_lavc.h"
+ #include "common/global.h"
+ #include "common/msg.h"
+@@ -291,32 +292,20 @@ int encode_lavc_start(struct encode_lavc
+ 
+     CHECK_FAIL(ctx, 0);
+ 
+-    if (ctx->expect_video) {
+-        unsigned i;
+-        for (i = 0; i < ctx->avc->nb_streams; ++i)
+-            if (ctx->avc->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
+-                break;
+-        if (i >= ctx->avc->nb_streams) {
+-            if (ctx->avc->oformat->video_codec != AV_CODEC_ID_NONE ||
+-                ctx->options->vcodec) {
+-                encode_lavc_fail(ctx,
+-                    "no video stream succeeded - invalid codec?\n");
+-                return 0;
+-            }
++    if (ctx->expect_video && ctx->vcc == NULL) {
++        if (ctx->avc->oformat->video_codec != AV_CODEC_ID_NONE ||
++            ctx->options->vcodec) {
++            encode_lavc_fail(ctx,
++                "no video stream succeeded - invalid codec?\n");
++            return 0;
+         }
+     }
+-    if (ctx->expect_audio) {
+-        unsigned i;
+-        for (i = 0; i < ctx->avc->nb_streams; ++i)
+-            if (ctx->avc->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO)
+-                break;
+-        if (i >= ctx->avc->nb_streams) {
+-            if (ctx->avc->oformat->audio_codec != AV_CODEC_ID_NONE ||
+-                ctx->options->acodec) {
+-                encode_lavc_fail(ctx,
+-                    "no audio stream succeeded - invalid codec?\n");
+-                return 0;
+-            }
++    if (ctx->expect_audio && ctx->acc == NULL) {
++        if (ctx->avc->oformat->audio_codec != AV_CODEC_ID_NONE ||
++            ctx->options->acodec) {
++            encode_lavc_fail(ctx,
++                "no audio stream succeeded - invalid codec?\n");
++            return 0;
+         }
+     }
+ 
+@@ -387,33 +376,38 @@ void encode_lavc_finish(struct encode_la
+         if (ctx->header_written > 0)
+             av_write_trailer(ctx->avc);  // this is allowed to fail
+ 
+-        for (i = 0; i < ctx->avc->nb_streams; i++) {
+-            switch (ctx->avc->streams[i]->codec->codec_type) {
+-            case AVMEDIA_TYPE_VIDEO:
+-                if (ctx->twopass_bytebuffer_v) {
+-                    char *stats = ctx->avc->streams[i]->codec->stats_out;
+-                    if (stats)
+-                        stream_write_buffer(ctx->twopass_bytebuffer_v,
+-                                            stats, strlen(stats));
+-                }
+-                break;
+-            case AVMEDIA_TYPE_AUDIO:
+-                if (ctx->twopass_bytebuffer_a) {
+-                    char *stats = ctx->avc->streams[i]->codec->stats_out;
+-                    if (stats)
+-                        stream_write_buffer(ctx->twopass_bytebuffer_a,
+-                                            stats, strlen(stats));
+-                }
+-                break;
+-            default:
+-                break;
++        if (ctx->vcc) {
++            if (ctx->twopass_bytebuffer_v) {
++                char *stats = ctx->vcc->stats_out;
++                if (stats)
++                    stream_write_buffer(ctx->twopass_bytebuffer_v,
++                                        stats, strlen(stats));
+             }
+-            avcodec_close(ctx->avc->streams[i]->codec);
+-            talloc_free(ctx->avc->streams[i]->codec->stats_in);
+-            av_free(ctx->avc->streams[i]->codec);
++            avcodec_close(ctx->vcc);
++            talloc_free(ctx->vcc->stats_in);
++            av_free(ctx->vcc);
++            ctx->vcc = NULL;
++        }
++
++        if (ctx->acc) {
++            if (ctx->twopass_bytebuffer_a) {
++                char *stats = ctx->acc->stats_out;
++                if (stats)
++                    stream_write_buffer(ctx->twopass_bytebuffer_a,
++                                        stats, strlen(stats));
++            }
++            avcodec_close(ctx->acc);
++            talloc_free(ctx->acc->stats_in);
++            av_free(ctx->acc);
++            ctx->acc = NULL;
++        }
++
++        for (i = 0; i < ctx->avc->nb_streams; i++) {
+             av_free(ctx->avc->streams[i]->info);
+             av_free(ctx->avc->streams[i]);
+         }
++        ctx->vst = NULL;
++        ctx->ast = NULL;
+ 
+         if (ctx->twopass_bytebuffer_v) {
+             free_stream(ctx->twopass_bytebuffer_v);
+@@ -437,6 +431,7 @@ void encode_lavc_finish(struct encode_la
+         }
+ 
+         av_free(ctx->avc);
++        ctx->avc = NULL;
+     }
+ 
+     ctx->finished = true;
+@@ -461,7 +456,9 @@ void encode_lavc_set_audio_pts(struct en
+ 
+ static void encode_2pass_prepare(struct encode_lavc_context *ctx,
+                                  AVDictionary **dictp,
+-                                 AVStream *stream, struct stream **bytebuf,
++                                 AVStream *stream,
++                                 AVCodecContext *codec,
++                                 struct stream **bytebuf,
+                                  const char *prefix)
+ {
+     if (!*bytebuf) {
+@@ -476,7 +473,7 @@ static void encode_2pass_prepare(struct 
+             if (!(*bytebuf = stream_open(buf, ctx->global))) {
+                 MP_WARN(ctx, "%s: could not open '%s', "
+                        "disabling 2-pass encoding at pass 2\n", prefix, buf);
+-                stream->codec->flags &= ~CODEC_FLAG_PASS2;
++                codec->flags &= ~CODEC_FLAG_PASS2;
+                 set_to_avdictionary(ctx, dictp, "flags", "-pass2");
+             } else {
+                 struct bstr content = stream_read_complete(*bytebuf, NULL,
+@@ -487,7 +484,7 @@ static void encode_2pass_prepare(struct 
+                            prefix, ctx->avc->filename);
+                 } else {
+                     content.start[content.len] = 0;
+-                    stream->codec->stats_in = content.start;
++                    codec->stats_in = content.start;
+                 }
+                 free_stream(*bytebuf);
+                 *bytebuf = NULL;
+@@ -506,43 +503,55 @@ static void encode_2pass_prepare(struct 
+     }
+ }
+ 
+-AVStream *encode_lavc_alloc_stream(struct encode_lavc_context *ctx,
+-                                   enum AVMediaType mt)
++int encode_lavc_alloc_stream(struct encode_lavc_context *ctx,
++                             enum AVMediaType mt,
++                             AVStream **stream_out,
++                             AVCodecContext **codec_out)
+ {
+     AVDictionaryEntry *de;
+-    AVStream *stream = NULL;
+     char **p;
+-    int i;
+ 
+-    CHECK_FAIL(ctx, NULL);
++    *stream_out = NULL;
++    *codec_out = NULL;
+ 
+-    if (ctx->header_written)
+-        return NULL;
++    CHECK_FAIL(ctx, -1);
+ 
+-    for (i = 0; i < ctx->avc->nb_streams; ++i)
+-        if (ctx->avc->streams[i]->codec->codec_type == mt)
+-            // already have a stream of that type, this cannot really happen
+-            return NULL;
++    if (ctx->header_written)
++        return -1;
+ 
+     if (ctx->avc->nb_streams == 0) {
+         // if this stream isn't stream #0, allocate a dummy stream first for
+-        // the next loop to use
++        // the next call to use
+         if (mt == AVMEDIA_TYPE_VIDEO && ctx->audio_first) {
+             MP_INFO(ctx, "vo-lavc: preallocated audio stream for later use\n");
+-            avformat_new_stream(ctx->avc, NULL); // this one is AVMEDIA_TYPE_UNKNOWN for now
++            ctx->ast = avformat_new_stream(
++                ctx->avc, NULL);  // this one is AVMEDIA_TYPE_UNKNOWN for now
+         }
+         if (mt == AVMEDIA_TYPE_AUDIO && ctx->video_first) {
+             MP_INFO(ctx, "ao-lavc: preallocated video stream for later use\n");
+-            avformat_new_stream(ctx->avc, NULL); // this one is AVMEDIA_TYPE_UNKNOWN for now
++            ctx->vst = avformat_new_stream(
++                ctx->avc, NULL);  // this one is AVMEDIA_TYPE_UNKNOWN for now
+         }
+-    } else {
+-        // find possibly preallocated stream
+-        for (i = 0; i < ctx->avc->nb_streams; ++i)
+-            if (ctx->avc->streams[i]->codec->codec_type == AVMEDIA_TYPE_UNKNOWN) // preallocated stream
+-                stream = ctx->avc->streams[i];
+     }
+-    if (!stream)
+-        stream = avformat_new_stream(ctx->avc, NULL);
++
++    // already have a stream of that type (this cannot really happen)?
++    switch (mt) {
++    case AVMEDIA_TYPE_VIDEO:
++        if (ctx->vcc != NULL)
++            return -1;
++        if (ctx->vst == NULL)
++            ctx->vst = avformat_new_stream(ctx->avc, NULL);
++        break;
++    case AVMEDIA_TYPE_AUDIO:
++        if (ctx->acc != NULL)
++            return -1;
++        if (ctx->ast == NULL)
++            ctx->ast = avformat_new_stream(ctx->avc, NULL);
++        break;
++    default:
++        encode_lavc_fail(ctx, "requested invalid stream type\n");
++        return -1;
++    }
+ 
+     if (ctx->timebase.den == 0) {
+         AVRational r;
+@@ -584,13 +593,18 @@ AVStream *encode_lavc_alloc_stream(struc
+                 ctx->options->vcodec) {
+                 encode_lavc_fail(ctx, "vo-lavc: encoder not found\n");
+             }
+-            return NULL;
++            return -1;
+         }
+-        avcodec_get_context_defaults3(stream->codec, ctx->vc);
++#if HAVE_AVCODEC_HAS_CODECPAR
++        ctx->vcc = avcodec_alloc_context3(ctx->vc);
++#else
++        avcodec_get_context_defaults3(ctx->vst->codec, ctx->vc);
++        ctx->vcc = ctx->vst->codec;
++#endif
+ 
+         // Using codec->time_base is deprecated, but needed for older lavf.
+-        stream->time_base = ctx->timebase;
+-        stream->codec->time_base = ctx->timebase;
++        ctx->vst->time_base = ctx->timebase;
++        ctx->vcc->time_base = ctx->timebase;
+ 
+         ctx->voptions = NULL;
+ 
+@@ -606,10 +620,12 @@ AVStream *encode_lavc_alloc_stream(struc
+         if (ctx->avc->oformat->flags & AVFMT_GLOBALHEADER)
+             set_to_avdictionary(ctx, &ctx->voptions, "flags", "+global_header");
+ 
+-        encode_2pass_prepare(ctx, &ctx->voptions, stream,
++        encode_2pass_prepare(ctx, &ctx->voptions, ctx->vst, ctx->vcc,
+                              &ctx->twopass_bytebuffer_v,
+                              "vo-lavc");
+-        break;
++        *stream_out = ctx->vst;
++        *codec_out = ctx->vcc;
++        return 0;
+ 
+     case AVMEDIA_TYPE_AUDIO:
+         if (!ctx->ac) {
+@@ -617,15 +633,20 @@ AVStream *encode_lavc_alloc_stream(struc
+                 ctx->options->acodec) {
+                 encode_lavc_fail(ctx, "ao-lavc: encoder not found\n");
+             }
+-            return NULL;
++            return -1;
+         }
+-        avcodec_get_context_defaults3(stream->codec, ctx->ac);
++#if HAVE_AVCODEC_HAS_CODECPAR
++        ctx->acc = avcodec_alloc_context3(ctx->ac);
++#else
++        avcodec_get_context_defaults3(ctx->ast->codec, ctx->ac);
++        ctx->acc = ctx->ast->codec;
++#endif
+ 
+         // Using codec->time_base is deprecated, but needed for older lavf.
+-        stream->time_base = ctx->timebase;
+-        stream->codec->time_base = ctx->timebase;
++        ctx->ast->time_base = ctx->timebase;
++        ctx->acc->time_base = ctx->timebase;
+ 
+-        ctx->aoptions = NULL;
++        ctx->aoptions = 0;
+ 
+         if (ctx->options->aopts)
+             for (p = ctx->options->aopts; *p; ++p)
+@@ -639,49 +660,34 @@ AVStream *encode_lavc_alloc_stream(struc
+         if (ctx->avc->oformat->flags & AVFMT_GLOBALHEADER)
+             set_to_avdictionary(ctx, &ctx->aoptions, "flags", "+global_header");
+ 
+-        encode_2pass_prepare(ctx, &ctx->aoptions, stream,
++        encode_2pass_prepare(ctx, &ctx->aoptions, ctx->ast, ctx->acc,
+                              &ctx->twopass_bytebuffer_a,
+                              "ao-lavc");
+-        break;
+ 
+-    default:
+-        encode_lavc_fail(ctx, "requested invalid stream type\n");
+-        return NULL;
++        *stream_out = ctx->ast;
++        *codec_out = ctx->acc;
++        return 0;
+     }
+ 
+-    return stream;
+-}
+-
+-AVCodec *encode_lavc_get_codec(struct encode_lavc_context *ctx,
+-                               AVStream *stream)
+-{
+-    CHECK_FAIL(ctx, NULL);
+-
+-    switch (stream->codec->codec_type) {
+-    case AVMEDIA_TYPE_VIDEO:
+-        return ctx->vc;
+-    case AVMEDIA_TYPE_AUDIO:
+-        return ctx->ac;
+-    default:
+-        break;
+-    }
+-    return NULL;
++    // Unreachable.
++    return -1;
+ }
+ 
+-int encode_lavc_open_codec(struct encode_lavc_context *ctx, AVStream *stream)
++int encode_lavc_open_codec(struct encode_lavc_context *ctx,
++                           AVCodecContext *codec)
+ {
+     AVDictionaryEntry *de;
+     int ret;
+ 
+     CHECK_FAIL(ctx, -1);
+ 
+-    switch (stream->codec->codec_type) {
++    switch (codec->codec_type) {
+     case AVMEDIA_TYPE_VIDEO:
+         MP_INFO(ctx, "Opening video encoder: %s [%s]\n",
+                 ctx->vc->long_name, ctx->vc->name);
+ 
+         if (ctx->vc->capabilities & CODEC_CAP_EXPERIMENTAL) {
+-            stream->codec->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
++            codec->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
+             MP_WARN(ctx, "\n\n"
+                        "           ********************************************\n"
+                        "           **** Experimental VIDEO codec selected! ****\n"
+@@ -701,7 +707,11 @@ int encode_lavc_open_codec(struct encode
+                    ctx->vc->name);
+         }
+ 
+-        ret = avcodec_open2(stream->codec, ctx->vc, &ctx->voptions);
++        ret = avcodec_open2(codec, ctx->vc, &ctx->voptions);
++#if HAVE_AVCODEC_HAS_CODECPAR
++        if (ret >= 0)
++            ret = avcodec_parameters_from_context(ctx->vst->codecpar, codec);
++#endif
+ 
+         // complain about all remaining options, then free the dict
+         for (de = NULL; (de = av_dict_get(ctx->voptions, "", de,
+@@ -716,7 +726,7 @@ int encode_lavc_open_codec(struct encode
+                 ctx->ac->long_name, ctx->ac->name);
+ 
+         if (ctx->ac->capabilities & CODEC_CAP_EXPERIMENTAL) {
+-            stream->codec->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
++            codec->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
+             MP_WARN(ctx, "\n\n"
+                        "           ********************************************\n"
+                        "           **** Experimental AUDIO codec selected! ****\n"
+@@ -735,7 +745,12 @@ int encode_lavc_open_codec(struct encode
+                        "If none of this helps you, try another codec in place of %s.\n\n",
+                    ctx->ac->name);
+         }
+-        ret = avcodec_open2(stream->codec, ctx->ac, &ctx->aoptions);
++
++        ret = avcodec_open2(codec, ctx->ac, &ctx->aoptions);
++#if HAVE_AVCODEC_HAS_CODECPAR
++        if (ret >= 0)
++            ret = avcodec_parameters_from_context(ctx->ast->codecpar, codec);
++#endif
+ 
+         // complain about all remaining options, then free the dict
+         for (de = NULL; (de = av_dict_get(ctx->aoptions, "", de,
+@@ -757,36 +772,43 @@ int encode_lavc_open_codec(struct encode
+     return ret;
+ }
+ 
+-void encode_lavc_write_stats(struct encode_lavc_context *ctx, AVStream *stream)
++void encode_lavc_write_stats(struct encode_lavc_context *ctx,
++                             AVCodecContext *codec)
+ {
+     CHECK_FAIL(ctx, );
+ 
+-    switch (stream->codec->codec_type) {
++    switch (codec->codec_type) {
+     case AVMEDIA_TYPE_VIDEO:
+         if (ctx->twopass_bytebuffer_v)
+-            if (stream->codec->stats_out)
++            if (codec->stats_out)
+                 stream_write_buffer(ctx->twopass_bytebuffer_v,
+-                                    stream->codec->stats_out,
+-                                    strlen(stream->codec->stats_out));
++                                    codec->stats_out,
++                                    strlen(codec->stats_out));
+         break;
+     case AVMEDIA_TYPE_AUDIO:
+         if (ctx->twopass_bytebuffer_a)
+-            if (stream->codec->stats_out)
++            if (codec->stats_out)
+                 stream_write_buffer(ctx->twopass_bytebuffer_a,
+-                                    stream->codec->stats_out,
+-                                    strlen(stream->codec->stats_out));
++                                    codec->stats_out,
++                                    strlen(codec->stats_out));
+         break;
+     default:
+         break;
+     }
+ }
+ 
+-int encode_lavc_write_frame(struct encode_lavc_context *ctx, AVPacket *packet)
++int encode_lavc_write_frame(struct encode_lavc_context *ctx, AVStream *stream,
++                            AVPacket *packet)
+ {
+     int r;
+ 
+     CHECK_FAIL(ctx, -1);
+ 
++    if (stream->index != packet->stream_index) {
++        MP_ERR(ctx, "Called encode_lavc_write_frame on the wrong stream\n");
++        return -1;
++    }
++
+     if (ctx->header_written <= 0)
+         return -1;
+ 
+@@ -795,27 +817,32 @@ int encode_lavc_write_frame(struct encod
+         (int)packet->stream_index,
+         (int)packet->pts,
+         packet->pts
+-        * (double)ctx->avc->streams[packet->stream_index]->time_base.num
+-        / (double)ctx->avc->streams[packet->stream_index]->time_base.den,
++        * (double)stream->time_base.num
++        / (double)stream->time_base.den,
+         (int)packet->dts,
+         packet->dts
+-        * (double)ctx->avc->streams[packet->stream_index]->time_base.num
+-        / (double)ctx->avc->streams[packet->stream_index]->time_base.den,
++        * (double)stream->time_base.num
++        / (double)stream->time_base.den,
+         (int)packet->size);
+ 
+-    switch (ctx->avc->streams[packet->stream_index]->codec->codec_type) {
+-    case AVMEDIA_TYPE_VIDEO:
+-        ctx->vbytes += packet->size;
+-        ++ctx->frames;
+-        break;
+-    case AVMEDIA_TYPE_AUDIO:
+-        ctx->abytes += packet->size;
+-        ctx->audioseconds += packet->duration
+-            * (double)ctx->avc->streams[packet->stream_index]->time_base.num
+-            / (double)ctx->avc->streams[packet->stream_index]->time_base.den;
+-        break;
+-    default:
+-        break;
++
++#if HAVE_AVCODEC_HAS_CODECPAR
++    switch (stream->codecpar->codec_type) {
++#else
++    switch (stream->codec->codec_type) {
++#endif
++        case AVMEDIA_TYPE_VIDEO:
++            ctx->vbytes += packet->size;
++            ++ctx->frames;
++            break;
++        case AVMEDIA_TYPE_AUDIO:
++            ctx->abytes += packet->size;
++            ctx->audioseconds += packet->duration
++                    * (double)stream->time_base.num
++                    / (double)stream->time_base.den;
++            break;
++        default:
++            break;
+     }
+ 
+     r = av_interleaved_write_frame(ctx->avc, packet);
+@@ -1062,11 +1089,12 @@ bool encode_lavc_showhelp(struct mp_log 
+     return help_output;
+ }
+ 
+-double encode_lavc_getoffset(struct encode_lavc_context *ctx, AVStream *stream)
++double encode_lavc_getoffset(struct encode_lavc_context *ctx,
++                             AVCodecContext *codec)
+ {
+     CHECK_FAIL(ctx, 0);
+ 
+-    switch (stream->codec->codec_type) {
++    switch (codec->codec_type) {
+     case AVMEDIA_TYPE_VIDEO:
+         return ctx->options->voffset;
+     case AVMEDIA_TYPE_AUDIO:
+@@ -1151,49 +1179,49 @@ void encode_lavc_fail(struct encode_lavc
+ }
+ 
+ bool encode_lavc_set_csp(struct encode_lavc_context *ctx,
+-                         AVStream *stream, enum mp_csp csp)
++                         AVCodecContext *codec, enum mp_csp csp)
+ {
+     CHECK_FAIL(ctx, NULL);
+ 
+     if (ctx->header_written) {
+-        if (stream->codec->colorspace != mp_csp_to_avcol_spc(csp))
++        if (codec->colorspace != mp_csp_to_avcol_spc(csp))
+             MP_WARN(ctx, "can not change color space during encoding\n");
+         return false;
+     }
+ 
+-    stream->codec->colorspace = mp_csp_to_avcol_spc(csp);
++    codec->colorspace = mp_csp_to_avcol_spc(csp);
+     return true;
+ }
+ 
+ bool encode_lavc_set_csp_levels(struct encode_lavc_context *ctx,
+-                                AVStream *stream, enum mp_csp_levels lev)
++                                AVCodecContext *codec, enum mp_csp_levels lev)
+ {
+     CHECK_FAIL(ctx, NULL);
+ 
+     if (ctx->header_written) {
+-        if (stream->codec->color_range != mp_csp_levels_to_avcol_range(lev))
++        if (codec->color_range != mp_csp_levels_to_avcol_range(lev))
+             MP_WARN(ctx, "can not change color space during encoding\n");
+         return false;
+     }
+ 
+-    stream->codec->color_range = mp_csp_levels_to_avcol_range(lev);
++    codec->color_range = mp_csp_levels_to_avcol_range(lev);
+     return true;
+ }
+ 
+ enum mp_csp encode_lavc_get_csp(struct encode_lavc_context *ctx,
+-                                AVStream *stream)
++                                AVCodecContext *codec)
+ {
+     CHECK_FAIL(ctx, 0);
+ 
+-    return avcol_spc_to_mp_csp(stream->codec->colorspace);
++    return avcol_spc_to_mp_csp(codec->colorspace);
+ }
+ 
+ enum mp_csp_levels encode_lavc_get_csp_levels(struct encode_lavc_context *ctx,
+-                                              AVStream *stream)
++                                              AVCodecContext *codec)
+ {
+     CHECK_FAIL(ctx, 0);
+ 
+-    return avcol_range_to_mp_csp_levels(stream->codec->color_range);
++    return avcol_range_to_mp_csp_levels(codec->color_range);
+ }
+ 
+ // vim: ts=4 sw=4 et

Added: head/multimedia/mpv/files/patch-common_encode__lavc.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/multimedia/mpv/files/patch-common_encode__lavc.h	Thu Apr 14 12:15:21 2016	(r413260)
@@ -0,0 +1,60 @@
+--- common/encode_lavc.h.orig	2016-04-11 17:10:54 UTC
++++ common/encode_lavc.h
+@@ -46,8 +46,14 @@ struct encode_lavc_context {
+ 
+     float vo_fps;
+ 
+-    // these are processed from the options
++    // FFmpeg contexts.
+     AVFormatContext *avc;
++    AVStream *vst;
++    AVStream *ast;
++    AVCodecContext *vcc;
++    AVCodecContext *acc;
++
++    // these are processed from the options
+     AVRational timebase;
+     AVCodec *vc;
+     AVCodec *ac;
+@@ -88,26 +94,31 @@ struct encode_lavc_context {
+ };
+ 
+ // interface for vo/ao drivers
+-AVStream *encode_lavc_alloc_stream(struct encode_lavc_context *ctx, enum AVMediaType mt);
+-void encode_lavc_write_stats(struct encode_lavc_context *ctx, AVStream *stream);
+-int encode_lavc_write_frame(struct encode_lavc_context *ctx, AVPacket *packet);
++int encode_lavc_alloc_stream(struct encode_lavc_context *ctx,
++                             enum AVMediaType mt, AVStream **stream_out,
++                             AVCodecContext **codec_out);
++void encode_lavc_write_stats(struct encode_lavc_context *ctx,
++                             AVCodecContext *stream);
++int encode_lavc_write_frame(struct encode_lavc_context *ctx, AVStream *stream,
++                            AVPacket *packet);
+ int encode_lavc_supports_pixfmt(struct encode_lavc_context *ctx, enum AVPixelFormat format);
+-AVCodec *encode_lavc_get_codec(struct encode_lavc_context *ctx, AVStream *stream);
+-int encode_lavc_open_codec(struct encode_lavc_context *ctx, AVStream *stream);
++int encode_lavc_open_codec(struct encode_lavc_context *ctx,
++                           AVCodecContext *codec);
+ int encode_lavc_available(struct encode_lavc_context *ctx);
+ int encode_lavc_timesyncfailed(struct encode_lavc_context *ctx);
+ int encode_lavc_start(struct encode_lavc_context *ctx); // returns 1 on success
+ int encode_lavc_oformat_flags(struct encode_lavc_context *ctx);
+-double encode_lavc_getoffset(struct encode_lavc_context *ctx, AVStream *stream);
++double encode_lavc_getoffset(struct encode_lavc_context *ctx,
++                             AVCodecContext *codec);
+ void encode_lavc_fail(struct encode_lavc_context *ctx, const char *format, ...); // report failure of encoding
+ 
+ bool encode_lavc_set_csp(struct encode_lavc_context *ctx,
+-                         AVStream *stream, enum mp_csp csp);
++                         AVCodecContext *codec, enum mp_csp csp);
+ bool encode_lavc_set_csp_levels(struct encode_lavc_context *ctx,
+-                                AVStream *stream, enum mp_csp_levels lev);
++                                AVCodecContext *codec, enum mp_csp_levels lev);
+ enum mp_csp encode_lavc_get_csp(struct encode_lavc_context *ctx,
+-                                AVStream *stream);
++                                AVCodecContext *codec);
+ enum mp_csp_levels encode_lavc_get_csp_levels(struct encode_lavc_context *ctx,
+-                                              AVStream *stream);
++                                              AVCodecContext *codec);
+ 
+ #endif

Added: head/multimedia/mpv/files/patch-video_out_vo__lavc.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/multimedia/mpv/files/patch-video_out_vo__lavc.c	Thu Apr 14 12:15:21 2016	(r413260)
@@ -0,0 +1,163 @@
+--- video/out/vo_lavc.c.orig	2016-04-11 17:10:54 UTC
++++ video/out/vo_lavc.c
+@@ -37,6 +37,7 @@ struct priv {
+     uint8_t *buffer;
+     size_t buffer_size;
+     AVStream *stream;
++    AVCodecContext *codec;
+     int have_first_packet;
+ 
+     int harddup;
+@@ -108,14 +109,14 @@ static int reconfig(struct vo *vo, struc
+          * warning here. We choose to ignore that; just because ffmpeg currently
+          * uses a plain 'int' for these struct fields, it doesn't mean it always
+          * will */
+-        if (width == vc->stream->codec->width &&
+-                height == vc->stream->codec->height) {
+-            if (aspect.num != vc->stream->codec->sample_aspect_ratio.num ||
+-                    aspect.den != vc->stream->codec->sample_aspect_ratio.den) {
++        if (width == vc->codec->width &&
++                height == vc->codec->height) {
++            if (aspect.num != vc->codec->sample_aspect_ratio.num ||
++                    aspect.den != vc->codec->sample_aspect_ratio.den) {
+                 /* aspect-only changes are not critical */
+                 MP_WARN(vo, "unsupported pixel aspect ratio change from %d:%d to %d:%d\n",
+-                       vc->stream->codec->sample_aspect_ratio.num,
+-                       vc->stream->codec->sample_aspect_ratio.den,
++                       vc->codec->sample_aspect_ratio.num,
++                       vc->codec->sample_aspect_ratio.den,
+                        aspect.num, aspect.den);
+             }
+             goto done;
+@@ -144,18 +145,20 @@ static int reconfig(struct vo *vo, struc
+         goto error;
+     }
+ 
+-    vc->stream = encode_lavc_alloc_stream(vo->encode_lavc_ctx,
+-                                          AVMEDIA_TYPE_VIDEO);
+-    vc->stream->sample_aspect_ratio = vc->stream->codec->sample_aspect_ratio =
++    if (encode_lavc_alloc_stream(vo->encode_lavc_ctx,
++                                 AVMEDIA_TYPE_VIDEO,
++                                 &vc->stream, &vc->codec) < 0)
++        goto error;
++    vc->stream->sample_aspect_ratio = vc->codec->sample_aspect_ratio =
+             aspect;
+-    vc->stream->codec->width = width;
+-    vc->stream->codec->height = height;
+-    vc->stream->codec->pix_fmt = pix_fmt;
++    vc->codec->width = width;
++    vc->codec->height = height;
++    vc->codec->pix_fmt = pix_fmt;
+ 
+-    encode_lavc_set_csp(vo->encode_lavc_ctx, vc->stream, params->colorspace);
+-    encode_lavc_set_csp_levels(vo->encode_lavc_ctx, vc->stream, params->colorlevels);
++    encode_lavc_set_csp(vo->encode_lavc_ctx, vc->codec, params->colorspace);
++    encode_lavc_set_csp_levels(vo->encode_lavc_ctx, vc->codec, params->colorlevels);
+ 
+-    if (encode_lavc_open_codec(vo->encode_lavc_ctx, vc->stream) < 0)
++    if (encode_lavc_open_codec(vo->encode_lavc_ctx, vc->codec) < 0)
+         goto error;
+ 
+     vc->buffer_size = 6 * width * height + 200;
+@@ -204,7 +207,7 @@ static void write_packet(struct vo *vo, 
+         packet->stream_index = vc->stream->index;
+         if (packet->pts != AV_NOPTS_VALUE) {
+             packet->pts = av_rescale_q(packet->pts,
+-                                       vc->stream->codec->time_base,
++                                       vc->codec->time_base,
+                                        vc->stream->time_base);
+         } else {
+             MP_VERBOSE(vo, "codec did not provide pts\n");
+@@ -213,12 +216,12 @@ static void write_packet(struct vo *vo, 
+         }
+         if (packet->dts != AV_NOPTS_VALUE) {
+             packet->dts = av_rescale_q(packet->dts,
+-                                       vc->stream->codec->time_base,
++                                       vc->codec->time_base,
+                                        vc->stream->time_base);
+         }
+         if (packet->duration > 0) {
+             packet->duration = av_rescale_q(packet->duration,
+-                                       vc->stream->codec->time_base,
++                                       vc->codec->time_base,
+                                        vc->stream->time_base);
+         } else {
+             // HACK: libavformat calculates dts wrong if the initial packet
+@@ -226,15 +229,16 @@ static void write_packet(struct vo *vo, 
+             // have b-frames!
+             if (!packet->duration)
+                 if (!vc->have_first_packet)
+-                    if (vc->stream->codec->has_b_frames
+-                            || vc->stream->codec->max_b_frames)
++                    if (vc->codec->has_b_frames
++                            || vc->codec->max_b_frames)
+                         if (vc->stream->time_base.num * 1000LL <=
+                                 vc->stream->time_base.den)
+                             packet->duration = FFMAX(1, av_rescale_q(1,
+-                                 vc->stream->codec->time_base, vc->stream->time_base));
++                                 vc->codec->time_base, vc->stream->time_base));
+         }
+ 
+-        if (encode_lavc_write_frame(vo->encode_lavc_ctx, packet) < 0) {
++        if (encode_lavc_write_frame(vo->encode_lavc_ctx,
++                                    vc->stream, packet) < 0) {
+             MP_ERR(vo, "error writing\n");
+             return;
+         }
+@@ -251,23 +255,23 @@ static int encode_video(struct vo *vo, A
+             return 0;
+         memcpy(vc->buffer, frame, sizeof(AVPicture));
+         MP_DBG(vo, "got pts %f\n",
+-               frame->pts * (double) vc->stream->codec->time_base.num /
+-                            (double) vc->stream->codec->time_base.den);
++               frame->pts * (double) vc->codec->time_base.num /
++                            (double) vc->codec->time_base.den);
+         packet->size = sizeof(AVPicture);
+         return packet->size;
+     } else {
+         int got_packet = 0;
+-        int status = avcodec_encode_video2(vc->stream->codec, packet,
++        int status = avcodec_encode_video2(vc->codec, packet,
+                                            frame, &got_packet);
+         int size = (status < 0) ? status : got_packet ? packet->size : 0;
+ 
+         if (frame)
+             MP_DBG(vo, "got pts %f; out size: %d\n",
+-                   frame->pts * (double) vc->stream->codec->time_base.num /
+-                   (double) vc->stream->codec->time_base.den, size);
++                   frame->pts * (double) vc->codec->time_base.num /
++                   (double) vc->codec->time_base.den, size);
+ 
+         if (got_packet)
+-            encode_lavc_write_stats(vo->encode_lavc_ctx, vc->stream);
++            encode_lavc_write_stats(vo->encode_lavc_ctx, vc->codec);
+         return size;
+     }
+ }
+@@ -295,7 +299,7 @@ static void draw_image_unlocked(struct v
+         pts = vc->expected_next_pts;
+     }
+ 

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201604141215.u3ECFMPU071627>