On Sat, 1 Apr 2017 12:13:45 -0300 James Almer <jamr...@gmail.com> wrote:
> On 4/1/2017 8:28 AM, wm4 wrote: > > Can do audio decoding, audio encoding, video decoding, video encoding, > > video HW encoding. I also had video HW decoding, but removed it for now, > > as thw hwframes integration wasn't very sane. > > > > Some of the MS codecs aren't well tested, and might not work properly. > > --- > > +#define COBJMACROS > > +#define _WIN32_WINNT 0x0601 > > #if !defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0601 > #undef _WIN32_WINNT > #define _WIN32_WINNT 0x0601 > #endif OK I guess. Fixed locally. > > + > > +#include "mf_utils.h" > > + > > +// Include after mf_utils.h due to Windows include mess. > > +#include "libavutil/hwcontext.h" > > +#include "libavutil/hwcontext_mf.h" > > CC libavcodec/mf.o > /ffmpeg/src/libavcodec/mf.c:24:36: fatal error: libavutil/hwcontext_mf.h: No > such file or directory > #include "libavutil/hwcontext_mf.h" > ^ > compilation terminated. > make: *** [/ffmpeg/src/common.mak:60: libavcodec/mf.o] Error 1 This include statement can be removed. Then it'll most likely compile (unless the file recursively pulled in another needed include file). I removed hw decoding and the hwcontext stuff because it wasn't really done. > [...] > > > +#define MF_ENCODER(MEDIATYPE, NAME, ID, OPTS, EXTRA) \ > > + static const AVClass ff_ ## NAME ## _mf_encoder_class = { > > \ > > + .class_name = #NAME "_mf", > > \ > > + .item_name = av_default_item_name, > > \ > > + .option = OPTS, > > \ > > + .version = LIBAVUTIL_VERSION_INT, > > \ > > + }; > > \ > > + AVCodec ff_ ## NAME ## _mf_encoder = { > > \ > > + .priv_class = &ff_ ## NAME ## _mf_encoder_class, > > \ > > + .name = #NAME "_mf", > > \ > > + .long_name = NULL_IF_CONFIG_SMALL(#ID " via > > MediaFoundation"), \ > > + .type = AVMEDIA_TYPE_ ## MEDIATYPE, > > \ > > + .id = AV_CODEC_ID_ ## ID, > > \ > > + .priv_data_size = sizeof(MFContext), > > \ > > + .init = mf_init, > > \ > > + .close = mf_close, > > \ > > + .send_frame = mf_send_frame, > > \ > > + .receive_packet = mf_receive_packet, > > \ > > + EXTRA > > \ > > + .capabilities = AV_CODEC_CAP_DELAY, > > \ > > AV_CODEC_CAP_AVOID_PROBING maybe? Added locally. > > > + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | > > \ > > + FF_CODEC_CAP_INIT_CLEANUP, > > \ > > + }; > > + > > +#define AFMTS \ > > + .sample_fmts = (const enum AVSampleFormat[]){ > > AV_SAMPLE_FMT_S16, \ > > + > > AV_SAMPLE_FMT_NONE }, > > + > > +MF_ENCODER(AUDIO, aac, AAC, NULL, AFMTS); > > +MF_ENCODER(AUDIO, ac3, AC3, NULL, AFMTS); > > +MF_ENCODER(AUDIO, mp3, MP3, NULL, AFMTS); > > + > > +#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM > > +static const AVOption venc_opts[] = { > > + {"rate_control", "Select rate control mode", OFFSET(opt_enc_rc), > > AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VE, "rate_control"}, > > + { "default", "Default mode", 0, AV_OPT_TYPE_CONST, {.i64 = -1}, > > 0, 0, VE, "rate_control"}, > > + { "cbr", "CBR mode", 0, AV_OPT_TYPE_CONST, {.i64 = > > ff_eAVEncCommonRateControlMode_CBR}, 0, 0, VE, "rate_control"}, > > + { "pc_vbr", "Peak constrained VBR mode", 0, AV_OPT_TYPE_CONST, > > {.i64 = ff_eAVEncCommonRateControlMode_PeakConstrainedVBR}, 0, 0, VE, > > "rate_control"}, > > + { "u_vbr", "Unconstrained VBR mode", 0, AV_OPT_TYPE_CONST, > > {.i64 = ff_eAVEncCommonRateControlMode_UnconstrainedVBR}, 0, 0, VE, > > "rate_control"}, > > + { "quality", "Quality mode", 0, AV_OPT_TYPE_CONST, {.i64 = > > ff_eAVEncCommonRateControlMode_Quality}, 0, 0, VE, "rate_control" }, > > + // The following rate_control modes require Windows 8. > > + { "ld_vbr", "Low delay VBR mode", 0, AV_OPT_TYPE_CONST, {.i64 = > > ff_eAVEncCommonRateControlMode_LowDelayVBR}, 0, 0, VE, "rate_control"}, > > + { "g_vbr", "Global VBR mode", 0, AV_OPT_TYPE_CONST, {.i64 = > > ff_eAVEncCommonRateControlMode_GlobalVBR}, 0, 0, VE, "rate_control" }, > > + { "gld_vbr", "Global low delay VBR mode", 0, AV_OPT_TYPE_CONST, > > {.i64 = ff_eAVEncCommonRateControlMode_GlobalLowDelayVBR}, 0, 0, VE, > > "rate_control"}, > > + {"quality", "Quality", OFFSET(opt_enc_quality), AV_OPT_TYPE_INT, > > {.i64 = -1}, -1, 100, VE}, > > + {"hw_encoding", "Force hardware encoding", OFFSET(opt_enc_d3d), > > AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, VE, "hw_encoding"}, > > + {NULL} > > +}; > > + > > +#define VFMTS \ > > + .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, > > \ > > + > > AV_PIX_FMT_YUV420P, \ > > + AV_PIX_FMT_NONE }, > > + > > +MF_ENCODER(VIDEO, h264, H264, venc_opts, VFMTS); > > +MF_ENCODER(VIDEO, hevc, HEVC, venc_opts, VFMTS); > > diff --git a/libavcodec/mf_utils.c b/libavcodec/mf_utils.c > > new file mode 100644 > > index 0000000000..1a69e49581 > > --- /dev/null > > +++ b/libavcodec/mf_utils.c > > @@ -0,0 +1,693 @@ > > +/* > > + * This file is part of FFmpeg. > > + * > > + * 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. > > + * > > + * 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 > > + */ > > +#define COBJMACROS > > +#define _WIN32_WINNT 0x0601 > > Ditto Done. _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel