summaryrefslogtreecommitdiff
path: root/libavcodec/libx264.c
diff options
context:
space:
mode:
authorThemaister <maister@archlinux.us>2011-10-08 12:16:43 +0200
committerMichael Niedermayer <michaelni@gmx.at>2011-10-09 05:48:39 +0200
commit18a97b030c923579c694353f8529f05701b481e8 (patch)
tree899627ba41c14596bac96b98d29eb2daf6148404 /libavcodec/libx264.c
parentc5db8b4d09762f5228eaf3c3a0017657ed27d866 (diff)
Allow YUV444P and RGB/BGR encoding for libx264.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/libx264.c')
-rw-r--r--libavcodec/libx264.c58
1 files changed, 55 insertions, 3 deletions
diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c
index 5c503237b5..894a63eadb 100644
--- a/libavcodec/libx264.c
+++ b/libavcodec/libx264.c
@@ -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[] = {