42
42
#include "atsc_a53.h"
43
43
#include "sei.h"
44
44
45
+ #if defined(X265_ENABLE_ALPHA ) && MAX_LAYERS > 2
46
+ #define FF_X265_MAX_LAYERS MAX_LAYERS
47
+ #elif X265_BUILD >= 210
48
+ #define FF_X265_MAX_LAYERS 2
49
+ #else
50
+ #define FF_X265_MAX_LAYERS 1
51
+ #endif
52
+
45
53
typedef struct ReorderedData {
46
54
int64_t duration ;
47
55
@@ -539,6 +547,15 @@ FF_ENABLE_DEPRECATION_WARNINGS
539
547
ctx -> dovi .cfg .dv_bl_signal_compatibility_id ;
540
548
#endif
541
549
550
+ #if X265_BUILD >= 210 && FF_X265_MAX_LAYERS > 1
551
+ if (desc -> flags & AV_PIX_FMT_FLAG_ALPHA ) {
552
+ if (ctx -> api -> param_parse (ctx -> params , "alpha" , "1" ) < 0 ) {
553
+ av_log (avctx , AV_LOG_ERROR , "Loaded libx265 does not support alpha layer encoding.\n" );
554
+ return AVERROR (ENOTSUP );
555
+ }
556
+ }
557
+ #endif
558
+
542
559
ctx -> encoder = ctx -> api -> encoder_open (ctx -> params );
543
560
if (!ctx -> encoder ) {
544
561
av_log (avctx , AV_LOG_ERROR , "Cannot open libx265 encoder.\n" );
@@ -659,15 +676,13 @@ static void free_picture(libx265Context *ctx, x265_picture *pic)
659
676
static int libx265_encode_frame (AVCodecContext * avctx , AVPacket * pkt ,
660
677
const AVFrame * pic , int * got_packet )
661
678
{
679
+ const AVPixFmtDescriptor * desc = av_pix_fmt_desc_get (avctx -> pix_fmt );
662
680
libx265Context * ctx = avctx -> priv_data ;
663
681
x265_picture x265pic ;
682
+ x265_picture x265pic_out [FF_X265_MAX_LAYERS ] = { 0 };
664
683
#if (X265_BUILD >= 210 ) && (X265_BUILD < 213 )
665
- x265_picture x265pic_layers_out [MAX_SCALABLE_LAYERS ];
666
- x265_picture * x265pic_lyrptr_out [MAX_SCALABLE_LAYERS ];
667
- #else
668
- x265_picture x265pic_solo_out = { 0 };
684
+ x265_picture * x265pic_lyrptr_out [FF_X265_MAX_LAYERS ];
669
685
#endif
670
- x265_picture * x265pic_out ;
671
686
x265_nal * nal ;
672
687
x265_sei * sei ;
673
688
uint8_t * dst ;
@@ -687,7 +702,7 @@ static int libx265_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
687
702
ReorderedData * rd ;
688
703
int rd_idx ;
689
704
690
- for (i = 0 ; i < 3 ; i ++ ) {
705
+ for (i = 0 ; i < desc -> nb_components ; i ++ ) {
691
706
x265pic .planes [i ] = pic -> data [i ];
692
707
x265pic .stride [i ] = pic -> linesize [i ];
693
708
}
@@ -806,14 +821,14 @@ static int libx265_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
806
821
}
807
822
808
823
#if (X265_BUILD >= 210 ) && (X265_BUILD < 213 )
809
- for (i = 0 ; i < MAX_SCALABLE_LAYERS ; i ++ )
810
- x265pic_lyrptr_out [i ] = & x265pic_layers_out [i ];
824
+ for (i = 0 ; i < FF_ARRAY_ELEMS ( x265pic_out ) ; i ++ )
825
+ x265pic_lyrptr_out [i ] = & x265pic_out [i ];
811
826
812
827
ret = ctx -> api -> encoder_encode (ctx -> encoder , & nal , & nnal ,
813
828
pic ? & x265pic : NULL , x265pic_lyrptr_out );
814
829
#else
815
830
ret = ctx -> api -> encoder_encode (ctx -> encoder , & nal , & nnal ,
816
- pic ? & x265pic : NULL , & x265pic_solo_out );
831
+ pic ? & x265pic : NULL , x265pic_out );
817
832
#endif
818
833
819
834
for (i = 0 ; i < sei -> numPayloads ; i ++ )
@@ -844,12 +859,6 @@ static int libx265_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
844
859
pkt -> flags |= AV_PKT_FLAG_KEY ;
845
860
}
846
861
847
- #if (X265_BUILD >= 210 ) && (X265_BUILD < 213 )
848
- x265pic_out = x265pic_lyrptr_out [0 ];
849
- #else
850
- x265pic_out = & x265pic_solo_out ;
851
- #endif
852
-
853
862
pkt -> pts = x265pic_out -> pts ;
854
863
pkt -> dts = x265pic_out -> dts ;
855
864
@@ -907,6 +916,9 @@ static const enum AVPixelFormat x265_csp_eight[] = {
907
916
AV_PIX_FMT_YUVJ444P ,
908
917
AV_PIX_FMT_GBRP ,
909
918
AV_PIX_FMT_GRAY8 ,
919
+ #if X265_BUILD >= 210 && FF_X265_MAX_LAYERS > 1
920
+ AV_PIX_FMT_YUVA420P ,
921
+ #endif
910
922
AV_PIX_FMT_NONE
911
923
};
912
924
@@ -924,6 +936,10 @@ static const enum AVPixelFormat x265_csp_ten[] = {
924
936
AV_PIX_FMT_GBRP10 ,
925
937
AV_PIX_FMT_GRAY8 ,
926
938
AV_PIX_FMT_GRAY10 ,
939
+ #if X265_BUILD >= 210 && FF_X265_MAX_LAYERS > 1
940
+ AV_PIX_FMT_YUVA420P ,
941
+ AV_PIX_FMT_YUVA420P10 ,
942
+ #endif
927
943
AV_PIX_FMT_NONE
928
944
};
929
945
@@ -946,6 +962,10 @@ static const enum AVPixelFormat x265_csp_twelve[] = {
946
962
AV_PIX_FMT_GRAY8 ,
947
963
AV_PIX_FMT_GRAY10 ,
948
964
AV_PIX_FMT_GRAY12 ,
965
+ #if X265_BUILD >= 210 && FF_X265_MAX_LAYERS > 1
966
+ AV_PIX_FMT_YUVA420P ,
967
+ AV_PIX_FMT_YUVA420P10 ,
968
+ #endif
949
969
AV_PIX_FMT_NONE
950
970
};
951
971
0 commit comments