|
|
|
@ -127,6 +127,49 @@ static int encode_nals(AVCodecContext *ctx, uint8_t *buf, int size, |
|
|
|
|
return p - buf; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int avfmt2_csp(int avfmt) |
|
|
|
|
{ |
|
|
|
|
switch (avfmt) { |
|
|
|
|
case PIX_FMT_YUV420P: |
|
|
|
|
case PIX_FMT_YUVJ420P: |
|
|
|
|
case PIX_FMT_YUV420P9: |
|
|
|
|
case PIX_FMT_YUV420P10: |
|
|
|
|
return X264_CSP_I420; |
|
|
|
|
#ifdef X264_CSP_I444 |
|
|
|
|
case PIX_FMT_YUV444P: |
|
|
|
|
return X264_CSP_I444; |
|
|
|
|
#endif |
|
|
|
|
#ifdef X264_CSP_BGR |
|
|
|
|
case PIX_FMT_BGR24: |
|
|
|
|
return X264_CSP_BGR; |
|
|
|
|
|
|
|
|
|
case PIX_FMT_RGB24: |
|
|
|
|
return X264_CSP_RGB; |
|
|
|
|
#endif |
|
|
|
|
default: |
|
|
|
|
return X264_CSP_NONE; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int avfmt2_num_planes(int avfmt) |
|
|
|
|
{ |
|
|
|
|
switch (avfmt) { |
|
|
|
|
case PIX_FMT_YUV420P: |
|
|
|
|
case PIX_FMT_YUVJ420P: |
|
|
|
|
case PIX_FMT_YUV420P9: |
|
|
|
|
case PIX_FMT_YUV420P10: |
|
|
|
|
case PIX_FMT_YUV444P: |
|
|
|
|
return 3; |
|
|
|
|
|
|
|
|
|
case PIX_FMT_BGR24: |
|
|
|
|
case PIX_FMT_RGB24: |
|
|
|
|
return 1; |
|
|
|
|
|
|
|
|
|
default: |
|
|
|
|
return 3; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int X264_frame(AVCodecContext *ctx, uint8_t *buf, |
|
|
|
|
int orig_bufsize, void *data) |
|
|
|
|
{ |
|
|
|
@ -138,13 +181,13 @@ static int X264_frame(AVCodecContext *ctx, uint8_t *buf, |
|
|
|
|
int bufsize; |
|
|
|
|
|
|
|
|
|
x264_picture_init( &x4->pic ); |
|
|
|
|
x4->pic.img.i_csp = X264_CSP_I420; |
|
|
|
|
x4->pic.img.i_csp = avfmt2_csp(ctx->pix_fmt); |
|
|
|
|
if (x264_bit_depth > 8) |
|
|
|
|
x4->pic.img.i_csp |= X264_CSP_HIGH_DEPTH; |
|
|
|
|
x4->pic.img.i_plane = 3; |
|
|
|
|
x4->pic.img.i_plane = avfmt2_num_planes(ctx->pix_fmt); |
|
|
|
|
|
|
|
|
|
if (frame) { |
|
|
|
|
for (i = 0; i < 3; i++) { |
|
|
|
|
for (i = 0; i < x4->pic.img.i_plane; i++) { |
|
|
|
|
x4->pic.img.plane[i] = frame->data[i]; |
|
|
|
|
x4->pic.img.i_stride[i] = frame->linesize[i]; |
|
|
|
|
} |
|
|
|
@ -490,6 +533,8 @@ static av_cold int X264_init(AVCodecContext *avctx) |
|
|
|
|
avctx->crf = x4->params.rc.f_rf_constant; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
x4->params.i_csp = avfmt2_csp(avctx->pix_fmt); |
|
|
|
|
|
|
|
|
|
x4->enc = x264_encoder_open(&x4->params); |
|
|
|
|
if (!x4->enc) |
|
|
|
|
return -1; |
|
|
|
@ -516,6 +561,13 @@ static av_cold int X264_init(AVCodecContext *avctx) |
|
|
|
|
static const enum PixelFormat pix_fmts_8bit[] = { |
|
|
|
|
PIX_FMT_YUV420P, |
|
|
|
|
PIX_FMT_YUVJ420P, |
|
|
|
|
#ifdef X264_CSP_I444 |
|
|
|
|
PIX_FMT_YUV444P, |
|
|
|
|
#endif |
|
|
|
|
#ifdef X264_CSP_BGR |
|
|
|
|
PIX_FMT_BGR24, |
|
|
|
|
PIX_FMT_RGB24, |
|
|
|
|
#endif |
|
|
|
|
PIX_FMT_NONE |
|
|
|
|
}; |
|
|
|
|
static const enum PixelFormat pix_fmts_9bit[] = { |
|
|
|
|