Merge commit '3a85397e8bb477eb34678d9edc52893f57003226'
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 9 Jul 2015 09:17:12 +0000 (11:17 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 9 Jul 2015 09:17:12 +0000 (11:17 +0200)
* commit '3a85397e8bb477eb34678d9edc52893f57003226':
  lavc: add Intel libmfx-based MPEG2 encoder

Conflicts:
Changelog
configure
libavcodec/allcodecs.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
Changelog
configure
libavcodec/Makefile
libavcodec/allcodecs.c
libavcodec/qsvenc.c
libavcodec/qsvenc_mpeg2.c

diff --cc Changelog
+++ b/Changelog
@@@ -2,73 -2,17 +2,74 @@@ Entries are sorted chronologically fro
  releases are sorted from youngest to oldest.
  
  version <next>:
 -- aliases and defaults for Ogg subtypes (opus, spx)
 -- HEVC/H.265 RTP payload format (draft v6) packetizer and depacketizer
 -- avplay now exits by default at the end of playback
 -- XCB-based screen-grabber
 -- creating DASH compatible fragmented MP4, MPEG-DASH segmenting muxer
 -- H.261 RTP payload format (RFC 4587) depacketizer and experimental packetizer
 +- colorkey video filter
 +- BFSTM/BCSTM demuxer
 +- little-endian ADPCM_THP decoder
 +- Hap decoder and encoder
 +- DirectDraw Surface image/texture decoder
 +- ssim filter
 +- rewritten ASF demuxer
 +- showvolume filter
 +- Many improvements to the JPEG 2000 decoder
 +- Go2Meeting decoding support
 +- adrawgraph audio and drawgraph video filter
 +- removegrain video filter
++- Intel QSV-accelerated MPEG-2 video encoding
 +
 +
 +version 2.7:
 +- FFT video filter
 +- TDSC decoder
 +- DTS lossless extension (XLL) decoding (not lossless, disabled by default)
 +- showwavespic filter
 +- DTS decoding through libdcadec
 +- Drop support for nvenc API before 5.0
 +- nvenc HEVC encoder
 +- Detelecine filter
 +- Intel QSV-accelerated H.264 encoding
 +- MMAL-accelerated H.264 decoding
 +- basic APNG encoder and muxer with default extension "apng"
 +- unpack DivX-style packed B-frames in MPEG-4 bitstream filter
 +- WebM Live Chunk Muxer
 +- nvenc level and tier options
 +- chorus filter
 +- Canopus HQ/HQA decoder
 +- Automatically rotate videos based on metadata in ffmpeg
 +- improved Quickdraw compatibility
 +- VP9 high bit-depth and extended colorspaces decoding support
 +- WebPAnimEncoder API when available for encoding and muxing WebP
 +- Direct3D11-accelerated decoding
 +- Support Secure Transport
 +- Multipart JPEG demuxer
 +
 +
 +version 2.6:
 +- nvenc encoder
 +- 10bit spp filter
 +- colorlevels filter
 +- RIFX format for *.wav files
  - RTP/mpegts muxer
 -- VP8 in Ogg demuxing
 +- non continuous cache protocol support
 +- tblend filter
 +- cropdetect support for non 8bpp, absolute (if limit >= 1) and relative (if limit < 1.0) threshold
 +- Camellia symmetric block cipher
  - OpenH264 encoder wrapper
 +- VOC seeking support
 +- Closed caption Decoder
 +- fspp, uspp, pp7 MPlayer postprocessing filters ported to native filters
 +- showpalette filter
 +- Twofish symmetric block cipher
  - Support DNx100 (960x720@8)
 -- Direct3D11-accelerated decoding
 +- eq2 filter ported from libmpcodecs as eq filter
 +- removed libmpcodecs
 +- Changed default DNxHD colour range in QuickTime .mov derivatives to mpeg range
 +- ported softpulldown filter from libmpcodecs as repeatfields filter
 +- dcshift filter
 +- RTP depacketizer for loss tolerant payload format for MP3 audio (RFC 5219)
 +- RTP depacketizer for AC3 payload format (RFC 4184)
 +- palettegen and paletteuse filters
 +- VP9 RTP payload format (draft 0) experimental depacketizer
 +- RTP depacketizer for DV (RFC 6469)
  - DXVA2-accelerated HEVC decoding
  - AAC ELD 480 decoding
  - Intel QSV-accelerated H.264 decoding
diff --cc configure
+++ b/configure
@@@ -2248,11 -1903,11 +2248,12 @@@ mpc7_decoder_select="bswapdsp mpegaudio
  mpc8_decoder_select="mpegaudiodsp"
  mpeg_xvmc_decoder_deps="X11_extensions_XvMClib_h"
  mpeg_xvmc_decoder_select="mpeg2video_decoder"
 +mpegvideo_decoder_select="error_resilience mpeg_er mpegvideo"
  mpeg1video_decoder_select="error_resilience mpeg_er mpegvideo"
 -mpeg1video_encoder_select="aandcttables mpegvideoenc"
 +mpeg1video_encoder_select="aandcttables mpegvideoenc h263dsp"
  mpeg2video_decoder_select="error_resilience mpeg_er mpegvideo"
 -mpeg2video_encoder_select="aandcttables mpegvideoenc"
 +mpeg2video_encoder_select="aandcttables mpegvideoenc h263dsp"
+ mpeg2_qsv_encoder_select="qsvenc"
  mpeg4_decoder_select="h263_decoder mpeg4video_parser"
  mpeg4_encoder_select="h263_encoder"
  msmpeg4v1_decoder_select="h263_decoder"
@@@ -352,8 -299,8 +352,9 @@@ OBJS-$(CONFIG_MPEG1VIDEO_DECODER)      
  OBJS-$(CONFIG_MPEG1VIDEO_ENCODER)      += mpeg12enc.o mpeg12.o
  OBJS-$(CONFIG_MPEG2VIDEO_DECODER)      += mpeg12dec.o mpeg12.o mpeg12data.o
  OBJS-$(CONFIG_MPEG2VIDEO_ENCODER)      += mpeg12enc.o mpeg12.o
+ OBJS-$(CONFIG_MPEG2_QSV_ENCODER)       += qsvenc_mpeg2.o
  OBJS-$(CONFIG_MPEG4_DECODER)           += xvididct.o
 +OBJS-$(CONFIG_MPL2_DECODER)            += mpl2dec.o ass.o
  OBJS-$(CONFIG_MSMPEG4V1_DECODER)       += msmpeg4dec.o msmpeg4.o msmpeg4data.o
  OBJS-$(CONFIG_MSMPEG4V2_DECODER)       += msmpeg4dec.o msmpeg4.o msmpeg4data.o
  OBJS-$(CONFIG_MSMPEG4V2_ENCODER)       += msmpeg4enc.o msmpeg4.o msmpeg4data.o
@@@ -565,10 -481,10 +565,11 @@@ void avcodec_register_all(void
      /* external libraries, that shouldn't be used by default if one of the
       * above is available */
      REGISTER_ENCODER(LIBOPENH264,       libopenh264);
 -    REGISTER_ENCODER(H264_NVENC,        h264_nvenc);
      REGISTER_ENCODER(H264_QSV,          h264_qsv);
 -    REGISTER_ENCODER(HEVC_NVENC,        hevc_nvenc);
 +    REGISTER_ENCODER(NVENC,             nvenc);
 +    REGISTER_ENCODER(NVENC_H264,        nvenc_h264);
 +    REGISTER_ENCODER(NVENC_HEVC,        nvenc_hevc);
+     REGISTER_ENCODER(MPEG2_QSV,         mpeg2_qsv);
  
      /* parsers */
      REGISTER_PARSER(AAC,                aac);
Simple merge
index 0000000,3601036..78200d3
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,117 +1,117 @@@
 - * This file is part of Libav.
+ /*
+  * Intel MediaSDK QSV based MPEG-2 encoder
+  *
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * FFmpeg is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU Lesser General Public
+  * License as published by the Free Software Foundation; either
+  * version 2.1 of the License, or (at your option) any later version.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * FFmpeg is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  * Lesser General Public License for more details.
+  *
+  * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ #include <stdint.h>
+ #include <sys/types.h>
+ #include <mfx/mfxvideo.h>
+ #include "libavutil/common.h"
+ #include "libavutil/opt.h"
+ #include "avcodec.h"
+ #include "internal.h"
+ #include "qsv.h"
+ #include "qsv_internal.h"
+ #include "qsvenc.h"
+ typedef struct QSVMpeg2EncContext {
+     AVClass *class;
+     QSVEncContext qsv;
+ } QSVMpeg2EncContext;
+ static av_cold int qsv_enc_init(AVCodecContext *avctx)
+ {
+     QSVMpeg2EncContext *q = avctx->priv_data;
+     return ff_qsv_enc_init(avctx, &q->qsv);
+ }
+ static int qsv_enc_frame(AVCodecContext *avctx, AVPacket *pkt,
+                          const AVFrame *frame, int *got_packet)
+ {
+     QSVMpeg2EncContext *q = avctx->priv_data;
+     return ff_qsv_encode(avctx, &q->qsv, pkt, frame, got_packet);
+ }
+ static av_cold int qsv_enc_close(AVCodecContext *avctx)
+ {
+     QSVMpeg2EncContext *q = avctx->priv_data;
+     return ff_qsv_enc_close(avctx, &q->qsv);
+ }
+ #define OFFSET(x) offsetof(QSVMpeg2EncContext, x)
+ #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
+ static const AVOption options[] = {
+     { "async_depth", "Maximum processing parallelism", OFFSET(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = ASYNC_DEPTH_DEFAULT }, 0, INT_MAX, VE },
+     { "avbr_accuracy",    "Accuracy of the AVBR ratecontrol",    OFFSET(qsv.avbr_accuracy),    AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
+     { "avbr_convergence", "Convergence of the AVBR ratecontrol", OFFSET(qsv.avbr_convergence), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
+     { "profile", NULL, OFFSET(qsv.profile), AV_OPT_TYPE_INT, { .i64 = MFX_PROFILE_UNKNOWN }, 0, INT_MAX, VE, "profile" },
+     { "unknown", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_PROFILE_UNKNOWN        }, INT_MIN, INT_MAX,     VE, "profile" },
+     { "simple",  NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_PROFILE_MPEG2_SIMPLE   }, INT_MIN, INT_MAX,     VE, "profile" },
+     { "main",    NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_PROFILE_MPEG2_MAIN     }, INT_MIN, INT_MAX,     VE, "profile" },
+     { "high",    NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_PROFILE_MPEG2_HIGH     }, INT_MIN, INT_MAX,     VE, "profile" },
+     { "preset", NULL, OFFSET(qsv.preset), AV_OPT_TYPE_INT, { .i64 = MFX_TARGETUSAGE_BALANCED }, 0, 7,   VE, "preset" },
+     { "fast",   NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_TARGETUSAGE_BEST_SPEED  },   INT_MIN, INT_MAX, VE, "preset" },
+     { "medium", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_TARGETUSAGE_BALANCED  },     INT_MIN, INT_MAX, VE, "preset" },
+     { "slow",   NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_TARGETUSAGE_BEST_QUALITY  }, INT_MIN, INT_MAX, VE, "preset" },
+     { NULL },
+ };
+ static const AVClass class = {
+     .class_name = "mpeg2_qsv encoder",
+     .item_name  = av_default_item_name,
+     .option     = options,
+     .version    = LIBAVUTIL_VERSION_INT,
+ };
+ static const AVCodecDefault qsv_enc_defaults[] = {
+     { "b",         "1M"    },
+     { "refs",      "0"     },
+     // same as the x264 default
+     { "g",         "250"   },
+     { "bf",        "3"     },
+     { "flags",     "+cgop" },
+     { NULL },
+ };
+ AVCodec ff_mpeg2_qsv_encoder = {
+     .name           = "mpeg2_qsv",
+     .long_name      = NULL_IF_CONFIG_SMALL("MPEG-2 video (Intel Quick Sync Video acceleration)"),
+     .priv_data_size = sizeof(QSVMpeg2EncContext),
+     .type           = AVMEDIA_TYPE_VIDEO,
+     .id             = AV_CODEC_ID_MPEG2VIDEO,
+     .init           = qsv_enc_init,
+     .encode2        = qsv_enc_frame,
+     .close          = qsv_enc_close,
+     .capabilities   = CODEC_CAP_DELAY,
+     .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12,
+                                                     AV_PIX_FMT_QSV,
+                                                     AV_PIX_FMT_NONE },
+     .priv_class     = &class,
+     .defaults       = qsv_enc_defaults,
+ };