55
void fillIntraPredModeCandidates(int candModeList[3], int x,int y, int PUidx,
56
bool availableA, // left
57
bool availableB, // top
58
const de265_image* img)
60
const seq_parameter_set* sps = &img->sps;
64
enum IntraPredMode candIntraPredModeA, candIntraPredModeB;
65
if (availableA==false) {
66
candIntraPredModeA=INTRA_DC;
68
else if (img->get_pred_mode(x-1,y) != MODE_INTRA ||
69
img->get_pcm_flag (x-1,y)) {
70
candIntraPredModeA=INTRA_DC;
73
candIntraPredModeA = img->get_IntraPredMode_atIndex(PUidx-1);
78
if (availableB==false) {
79
candIntraPredModeB=INTRA_DC;
81
else if (img->get_pred_mode(x,y-1) != MODE_INTRA ||
82
img->get_pcm_flag (x,y-1)) {
83
candIntraPredModeB=INTRA_DC;
85
else if (y-1 < ((y >> sps->Log2CtbSizeY) << sps->Log2CtbSizeY)) {
86
candIntraPredModeB=INTRA_DC;
89
candIntraPredModeB = img->get_IntraPredMode_atIndex(PUidx-sps->PicWidthInMinPUs);
93
// build candidate list
95
logtrace(LogSlice,"%d;%d availableA:%d candA:%d & availableB:%d candB:%d\n", x,y,
96
availableA, candIntraPredModeA,
97
availableB, candIntraPredModeB);
99
if (candIntraPredModeA == candIntraPredModeB) {
100
if (candIntraPredModeA < 2) {
101
candModeList[0] = INTRA_PLANAR;
102
candModeList[1] = INTRA_DC;
103
candModeList[2] = INTRA_ANGULAR_26;
106
candModeList[0] = candIntraPredModeA;
107
candModeList[1] = 2 + ((candIntraPredModeA-2 -1 +32) % 32);
108
candModeList[2] = 2 + ((candIntraPredModeA-2 +1 ) % 32);
112
candModeList[0] = candIntraPredModeA;
113
candModeList[1] = candIntraPredModeB;
115
if (candIntraPredModeA != INTRA_PLANAR &&
116
candIntraPredModeB != INTRA_PLANAR) {
117
candModeList[2] = INTRA_PLANAR;
119
else if (candIntraPredModeA != INTRA_DC &&
120
candIntraPredModeB != INTRA_DC) {
121
candModeList[2] = INTRA_DC;
124
candModeList[2] = INTRA_ANGULAR_26;
129
printf("candModeList: %d %d %d\n",
138
int find_intra_pred_mode(enum IntraPredMode mode,
141
// check whether the mode is in the candidate list
143
for (int i=0;i<3;i++) {
144
if (candModeList[i] == mode) {
151
if (candModeList[0] > candModeList[1]) {
152
std::swap(candModeList[0],candModeList[1]);
154
if (candModeList[0] > candModeList[2]) {
155
std::swap(candModeList[0],candModeList[2]);
157
if (candModeList[1] > candModeList[2]) {
158
std::swap(candModeList[1],candModeList[2]);
161
// skip modes already in the candidate list
163
int intraMode = mode;
165
for (int i=2;i>=0;i--) {
166
if (intraMode >= candModeList[i]) { intraMode--; }
173
void list_chroma_pred_candidates(enum IntraPredMode chroma_mode[5],
174
enum IntraPredMode luma_mode)
176
enum IntraPredMode chroma_cand[5];
177
chroma_cand[0] = INTRA_PLANAR;
178
chroma_cand[1] = INTRA_ANGULAR_26;
179
chroma_cand[2] = INTRA_ANGULAR_10;
180
chroma_cand[3] = INTRA_DC;
181
chroma_cand[4] = luma_mode;
184
case INTRA_PLANAR: chroma_cand[0] = INTRA_ANGULAR_34; break;
185
case INTRA_ANGULAR_26: chroma_cand[1] = INTRA_ANGULAR_34; break;
186
case INTRA_ANGULAR_10: chroma_cand[2] = INTRA_ANGULAR_34; break;
187
case INTRA_DC: chroma_cand[3] = INTRA_ANGULAR_34; break;
189
// use defaults from above
195
int get_intra_scan_idx(int log2TrafoSize, enum IntraPredMode intraPredMode, int cIdx,
196
const seq_parameter_set* sps)
198
if (log2TrafoSize==2 ||
199
(log2TrafoSize==3 && (cIdx==0 ||
200
sps->ChromaArrayType==CHROMA_444))) {
201
/**/ if (intraPredMode >= 6 && intraPredMode <= 14) return 2;
202
else if (intraPredMode >= 22 && intraPredMode <= 30) return 1;
209
int get_intra_scan_idx_luma(int log2TrafoSize, enum IntraPredMode intraPredMode)
211
if (log2TrafoSize==2 || log2TrafoSize==3) {
212
/**/ if (intraPredMode >= 6 && intraPredMode <= 14) return 2;
213
else if (intraPredMode >= 22 && intraPredMode <= 30) return 1;
219
int get_intra_scan_idx_chroma(int log2TrafoSize, enum IntraPredMode intraPredMode)
221
if (log2TrafoSize==1 || log2TrafoSize==2) {
222
/**/ if (intraPredMode >= 6 && intraPredMode <= 14) return 2;
223
else if (intraPredMode >= 22 && intraPredMode <= 30) return 1;
230
enum IntraPredMode lumaPredMode_to_chromaPredMode(enum IntraPredMode luma,
231
enum IntraChromaPredMode chroma)
234
case INTRA_CHROMA_LIKE_LUMA:
237
case INTRA_CHROMA_PLANAR_OR_34:
238
if (luma==INTRA_PLANAR) return INTRA_ANGULAR_34;
239
else return INTRA_PLANAR;
241
case INTRA_CHROMA_ANGULAR_26_OR_34:
242
if (luma==INTRA_ANGULAR_26) return INTRA_ANGULAR_34;
243
else return INTRA_ANGULAR_26;
245
case INTRA_CHROMA_ANGULAR_10_OR_34:
246
if (luma==INTRA_ANGULAR_10) return INTRA_ANGULAR_34;
247
else return INTRA_ANGULAR_10;
249
case INTRA_CHROMA_DC_OR_34:
250
if (luma==INTRA_DC) return INTRA_ANGULAR_34;
251
else return INTRA_DC;
55
void fill_border_samples(de265_image* img, int xB,int yB,
261
template <class pixel_t>
262
void fill_border_samples(de265_image* img,
263
int xB,int yB, // in component specific resolution
59
267
const seq_parameter_set* sps = &img->sps;
60
268
const pic_parameter_set* pps = &img->pps;
345
575
-315,-390,-482,-630,-910,-1638,-4096 };
348
// TODO: clip to read BitDepthY
349
LIBDE265_INLINE static int Clip1Y(int x) { if (x<0) return 0; else if (x>255) return 255; else return x; }
579
template <class pixel_t>
353
580
void intra_prediction_angular(de265_image* img,
355
582
enum IntraPredMode intraPredMode,
359
uint8_t ref_mem[2*64+1];
360
uint8_t* ref=&ref_mem[64];
586
pixel_t ref_mem[2*64+1];
587
pixel_t* ref=&ref_mem[64];
364
pred = img->get_image_plane_at_pos(cIdx,xB0,yB0);
591
pred = img->get_image_plane_at_pos_NEW<pixel_t>(cIdx,xB0,yB0);
365
592
stride = img->get_image_stride(cIdx);
594
int bit_depth = img->get_bit_depth(cIdx);
596
assert(intraPredMode<35);
597
assert(intraPredMode>=2);
367
599
int intraPredAngle = intraPredAngle_table[intraPredMode];
601
bool disableIntraBoundaryFilter =
602
(img->sps.range_extension.implicit_rdpcm_enabled_flag &&
603
img->get_cu_transquant_bypass(xB0,yB0));
369
605
if (intraPredMode >= 18) {
371
607
for (int x=0;x<=nT;x++)
529
printf("INTRAPRED DC\n");
530
for (int y=0;y<nT;y++) {
531
for (int x=0;x<nT;x++)
533
printf("%d ",pred[x+y*stride]);
766
logtrace(LogIntraPred,"INTRAPRED DC\n");
767
for (int y=0;y<nT;y++)
769
for (int x=0;x<nT;x++)
770
logtrace(LogIntraPred,"%02x ", pred[x+y*stride]);
772
logtrace(LogIntraPred,"\n");
778
template <class pixel_t>
779
void decode_intra_prediction_internal(de265_image* img,
781
enum IntraPredMode intraPredMode,
784
pixel_t border_pixels_mem[2*64+1];
785
pixel_t* border_pixels = &border_pixels_mem[64];
787
fill_border_samples(img, xB0,yB0, nT, cIdx, border_pixels);
789
if (img->sps.range_extension.intra_smoothing_disabled_flag == 0 &&
790
(cIdx==0 || img->sps.ChromaArrayType==CHROMA_444))
792
intra_prediction_sample_filtering(img, border_pixels, nT, cIdx, intraPredMode);
796
switch (intraPredMode) {
798
intra_prediction_planar(img,xB0,yB0,nT,cIdx, border_pixels);
801
intra_prediction_DC(img,xB0,yB0,nT,cIdx, border_pixels);
804
intra_prediction_angular(img,xB0,yB0,intraPredMode,nT,cIdx, border_pixels);
543
811
void decode_intra_prediction(de265_image* img,
552
820
xB0,yB0, intraPredMode, nT,cIdx);
555
uint8_t border_pixels_mem[2*64+1];
556
uint8_t* border_pixels = &border_pixels_mem[64];
558
fill_border_samples(img, xB0,yB0, nT, cIdx, border_pixels);
561
intra_prediction_sample_filtering(img, border_pixels, nT, intraPredMode);
823
if (img->high_bit_depth(cIdx)) {
824
decode_intra_prediction_internal<uint16_t>(img,xB0,yB0, intraPredMode,nT,cIdx);
565
switch (intraPredMode) {
567
intra_prediction_planar(img,xB0,yB0,nT,cIdx, border_pixels);
570
intra_prediction_DC(img,xB0,yB0,nT,cIdx, border_pixels);
573
intra_prediction_angular(img,xB0,yB0,intraPredMode,nT,cIdx, border_pixels);
827
decode_intra_prediction_internal<uint8_t>(img,xB0,yB0, intraPredMode,nT,cIdx);