diff options
| author | Tim Redfern <tim@eclectronics.org> | 2013-12-29 12:19:38 +0000 |
|---|---|---|
| committer | Tim Redfern <tim@eclectronics.org> | 2013-12-29 12:19:38 +0000 |
| commit | f7813a5324be39d13ab536c245d15dfc602a7849 (patch) | |
| tree | fad99148b88823d34a5df2f0a25881a002eb291b /ffmpeg/libavcodec/libx264.c | |
| parent | b7a5a477b8ff4d4e3028b9dfb9a9df0a41463f92 (diff) | |
basic type mechanism working
Diffstat (limited to 'ffmpeg/libavcodec/libx264.c')
| -rw-r--r-- | ffmpeg/libavcodec/libx264.c | 100 |
1 files changed, 85 insertions, 15 deletions
diff --git a/ffmpeg/libavcodec/libx264.c b/ffmpeg/libavcodec/libx264.c index 7e8fa65..8da1870 100644 --- a/ffmpeg/libavcodec/libx264.c +++ b/ffmpeg/libavcodec/libx264.c @@ -23,8 +23,14 @@ #include "libavutil/opt.h" #include "libavutil/mem.h" #include "libavutil/pixdesc.h" +#include "libavutil/stereo3d.h" #include "avcodec.h" #include "internal.h" + +#if defined(_MSC_VER) +#define X264_API_IMPORTS 1 +#endif + #include <x264.h> #include <float.h> #include <math.h> @@ -39,7 +45,6 @@ typedef struct X264Context { x264_picture_t pic; uint8_t *sei; int sei_size; - AVFrame out_pic; char *preset; char *tune; char *profile; @@ -59,6 +64,7 @@ typedef struct X264Context { int weightb; int ssim; int intra_refresh; + int bluray_compat; int b_bias; int b_pyramid; int mixed_refs; @@ -155,7 +161,8 @@ static int X264_frame(AVCodecContext *ctx, AVPacket *pkt, const AVFrame *frame, X264Context *x4 = ctx->priv_data; x264_nal_t *nal; int nnal, i, ret; - x264_picture_t pic_out; + x264_picture_t pic_out = {0}; + AVFrameSideData *side_data; x264_picture_init( &x4->pic ); x4->pic.img.i_csp = x4->params.i_csp; @@ -185,8 +192,42 @@ static int X264_frame(AVCodecContext *ctx, AVPacket *pkt, const AVFrame *frame, x4->params.vui.i_sar_width = ctx->sample_aspect_ratio.num; x264_encoder_reconfig(x4->enc, &x4->params); } - } + side_data = av_frame_get_side_data(frame, AV_FRAME_DATA_STEREO3D); + if (side_data) { + AVStereo3D *stereo = (AVStereo3D *)side_data->data; + int fpa_type; + + switch (stereo->type) { + case AV_STEREO3D_CHECKERBOARD: + fpa_type = 0; + break; + case AV_STEREO3D_LINES: + fpa_type = 1; + break; + case AV_STEREO3D_COLUMNS: + fpa_type = 2; + break; + case AV_STEREO3D_SIDEBYSIDE: + fpa_type = 3; + break; + case AV_STEREO3D_TOPBOTTOM: + fpa_type = 4; + break; + case AV_STEREO3D_FRAMESEQUENCE: + fpa_type = 5; + break; + default: + fpa_type = -1; + break; + } + + if (fpa_type != x4->params.i_frame_packing) { + x4->params.i_frame_packing = fpa_type; + x264_encoder_reconfig(x4->enc, &x4->params); + } + } + } do { if (x264_encoder_encode(x4->enc, &nal, &nnal, frame? &x4->pic: NULL, &pic_out) < 0) return -1; @@ -202,20 +243,20 @@ static int X264_frame(AVCodecContext *ctx, AVPacket *pkt, const AVFrame *frame, switch (pic_out.i_type) { case X264_TYPE_IDR: case X264_TYPE_I: - x4->out_pic.pict_type = AV_PICTURE_TYPE_I; + ctx->coded_frame->pict_type = AV_PICTURE_TYPE_I; break; case X264_TYPE_P: - x4->out_pic.pict_type = AV_PICTURE_TYPE_P; + ctx->coded_frame->pict_type = AV_PICTURE_TYPE_P; break; case X264_TYPE_B: case X264_TYPE_BREF: - x4->out_pic.pict_type = AV_PICTURE_TYPE_B; + ctx->coded_frame->pict_type = AV_PICTURE_TYPE_B; break; } pkt->flags |= AV_PKT_FLAG_KEY*pic_out.b_keyframe; if (ret) - x4->out_pic.quality = (pic_out.i_qpplus1 - 1) * FF_QP2LAMBDA; + ctx->coded_frame->quality = (pic_out.i_qpplus1 - 1) * FF_QP2LAMBDA; *got_packet = ret; return 0; @@ -231,13 +272,15 @@ static av_cold int X264_close(AVCodecContext *avctx) if (x4->enc) x264_encoder_close(x4->enc); + av_frame_free(&avctx->coded_frame); + return 0; } #define OPT_STR(opt, param) \ do { \ int ret; \ - if (param && (ret = x264_param_parse(&x4->params, opt, param)) < 0) { \ + if (param!=NULL && (ret = x264_param_parse(&x4->params, opt, param)) < 0) { \ if(ret == X264_PARAM_BAD_NAME) \ av_log(avctx, AV_LOG_ERROR, \ "bad option '%s': '%s'\n", opt, param); \ @@ -256,8 +299,10 @@ static int convert_pix_fmt(enum AVPixelFormat pix_fmt) case AV_PIX_FMT_YUV420P9: case AV_PIX_FMT_YUV420P10: return X264_CSP_I420; case AV_PIX_FMT_YUV422P: + case AV_PIX_FMT_YUVJ422P: case AV_PIX_FMT_YUV422P10: return X264_CSP_I422; case AV_PIX_FMT_YUV444P: + case AV_PIX_FMT_YUVJ444P: case AV_PIX_FMT_YUV444P9: case AV_PIX_FMT_YUV444P10: return X264_CSP_I444; #ifdef X264_CSP_BGR @@ -267,6 +312,9 @@ static int convert_pix_fmt(enum AVPixelFormat pix_fmt) case AV_PIX_FMT_RGB24: return X264_CSP_RGB; #endif + case AV_PIX_FMT_NV12: return X264_CSP_NV12; + case AV_PIX_FMT_NV16: + case AV_PIX_FMT_NV20: return X264_CSP_NV16; }; return 0; } @@ -428,6 +476,10 @@ static av_cold int X264_init(AVCodecContext *avctx) x4->params.analyse.b_ssim = x4->ssim; if (x4->intra_refresh >= 0) x4->params.b_intra_refresh = x4->intra_refresh; + if (x4->bluray_compat >= 0) { + x4->params.b_bluray_compat = x4->bluray_compat; + x4->params.b_vfr_input = 0; + } if (x4->b_bias != INT_MIN) x4->params.i_bframe_bias = x4->b_bias; if (x4->b_pyramid >= 0) @@ -520,7 +572,17 @@ static av_cold int X264_init(AVCodecContext *avctx) x4->params.i_slice_count = avctx->slices; - x4->params.vui.b_fullrange = avctx->pix_fmt == AV_PIX_FMT_YUVJ420P; + x4->params.vui.b_fullrange = avctx->pix_fmt == AV_PIX_FMT_YUVJ420P || + avctx->pix_fmt == AV_PIX_FMT_YUVJ422P || + avctx->pix_fmt == AV_PIX_FMT_YUVJ444P || + avctx->color_range == AVCOL_RANGE_JPEG; + + if (avctx->colorspace != AVCOL_SPC_UNSPECIFIED) + x4->params.vui.i_colmatrix = avctx->colorspace; + if (avctx->color_primaries != AVCOL_PRI_UNSPECIFIED) + x4->params.vui.i_colorprim = avctx->color_primaries; + if (avctx->color_trc != AVCOL_TRC_UNSPECIFIED) + x4->params.vui.i_transfer = avctx->color_trc; if (avctx->flags & CODEC_FLAG_GLOBAL_HEADER) x4->params.b_repeat_headers = 0; @@ -553,7 +615,9 @@ static av_cold int X264_init(AVCodecContext *avctx) if (!x4->enc) return -1; - avctx->coded_frame = &x4->out_pic; + avctx->coded_frame = av_frame_alloc(); + if (!avctx->coded_frame) + return AVERROR(ENOMEM); if (avctx->flags & CODEC_FLAG_GLOBAL_HEADER) { x264_nal_t *nal; @@ -585,7 +649,11 @@ static const enum AVPixelFormat pix_fmts_8bit[] = { AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUV422P, + AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUV444P, + AV_PIX_FMT_YUVJ444P, + AV_PIX_FMT_NV12, + AV_PIX_FMT_NV16, AV_PIX_FMT_NONE }; static const enum AVPixelFormat pix_fmts_9bit[] = { @@ -597,6 +665,7 @@ static const enum AVPixelFormat pix_fmts_10bit[] = { AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10, + AV_PIX_FMT_NV20, AV_PIX_FMT_NONE }; static const enum AVPixelFormat pix_fmts_8bit_rgb[] = { @@ -646,6 +715,7 @@ static const AVOption options[] = { { "smart", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = X264_WEIGHTP_SMART}, INT_MIN, INT_MAX, VE, "weightp" }, { "ssim", "Calculate and print SSIM stats.", OFFSET(ssim), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE }, { "intra-refresh", "Use Periodic Intra Refresh instead of IDR frames.",OFFSET(intra_refresh),AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE }, + { "bluray-compat", "Bluray compatibility workarounds.", OFFSET(bluray_compat) ,AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE }, { "b-bias", "Influences how often B-frames are used", OFFSET(b_bias), AV_OPT_TYPE_INT, { .i64 = INT_MIN}, INT_MIN, INT_MAX, VE }, { "b-pyramid", "Keep some B-frames as references.", OFFSET(b_pyramid), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, VE, "b_pyramid" }, { "none", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = X264_B_PYRAMID_NONE}, INT_MIN, INT_MAX, VE, "b_pyramid" }, @@ -676,7 +746,7 @@ static const AVOption options[] = { { NULL }, }; -static const AVClass class = { +static const AVClass x264_class = { .class_name = "libx264", .item_name = av_default_item_name, .option = options, @@ -722,6 +792,7 @@ static const AVCodecDefault x264_defaults[] = { AVCodec ff_libx264_encoder = { .name = "libx264", + .long_name = NULL_IF_CONFIG_SMALL("libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"), .type = AVMEDIA_TYPE_VIDEO, .id = AV_CODEC_ID_H264, .priv_data_size = sizeof(X264Context), @@ -729,22 +800,21 @@ AVCodec ff_libx264_encoder = { .encode2 = X264_frame, .close = X264_close, .capabilities = CODEC_CAP_DELAY | CODEC_CAP_AUTO_THREADS, - .long_name = NULL_IF_CONFIG_SMALL("libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"), - .priv_class = &class, + .priv_class = &x264_class, .defaults = x264_defaults, .init_static_data = X264_init_static, }; AVCodec ff_libx264rgb_encoder = { .name = "libx264rgb", + .long_name = NULL_IF_CONFIG_SMALL("libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 RGB"), .type = AVMEDIA_TYPE_VIDEO, .id = AV_CODEC_ID_H264, .priv_data_size = sizeof(X264Context), .init = X264_init, .encode2 = X264_frame, .close = X264_close, - .capabilities = CODEC_CAP_DELAY, - .long_name = NULL_IF_CONFIG_SMALL("libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 RGB"), + .capabilities = CODEC_CAP_DELAY | CODEC_CAP_AUTO_THREADS, .priv_class = &rgbclass, .defaults = x264_defaults, .pix_fmts = pix_fmts_8bit_rgb, |
