@@ -571,22 +571,32 @@ bool computeCodecsSpecifics(MediaFile_t *media)
571
571
572
572
// Chroma
573
573
if (avcC->sps_array [0 ]->chroma_format_idc == 0 )
574
- track->color_subsampling = CHROMA_SS_400;
574
+ track->chroma_subsampling = CHROMA_SS_400;
575
575
else if (avcC->sps_array [0 ]->chroma_format_idc == 1 )
576
- track->color_subsampling = CHROMA_SS_420;
576
+ track->chroma_subsampling = CHROMA_SS_420;
577
577
else if (avcC->sps_array [0 ]->chroma_format_idc == 2 )
578
- track->color_subsampling = CHROMA_SS_422;
578
+ track->chroma_subsampling = CHROMA_SS_422;
579
579
else if (avcC->sps_array [0 ]->chroma_format_idc == 3 )
580
- track->color_subsampling = CHROMA_SS_444;
580
+ track->chroma_subsampling = CHROMA_SS_444;
581
581
else
582
- track->color_subsampling = CHROMA_SS_420;
582
+ track->chroma_subsampling = CHROMA_SS_420;
583
583
584
584
if (avcC->sps_array [0 ]->vui )
585
585
{
586
586
track->color_range = avcC->sps_array [0 ]->vui ->video_full_range_flag ;
587
587
track->color_primaries = avcC->sps_array [0 ]->vui ->colour_primaries ;
588
588
track->color_transfer = avcC->sps_array [0 ]->vui ->transfer_characteristics ;
589
589
track->color_matrix = avcC->sps_array [0 ]->vui ->matrix_coefficients ;
590
+
591
+ if (avcC->sps_array [0 ]->vui ->chroma_loc_info_present_flag )
592
+ {
593
+ if (avcC->sps_array [0 ]->vui ->chroma_sample_loc_type_top_field == 0 ) track->chroma_location = CHROMA_LOC_LEFT;
594
+ else if (avcC->sps_array [0 ]->vui ->chroma_sample_loc_type_top_field == 1 ) track->chroma_location = CHROMA_LOC_CENTER;
595
+ else if (avcC->sps_array [0 ]->vui ->chroma_sample_loc_type_top_field == 2 ) track->chroma_location = CHROMA_LOC_TOPLEFT;
596
+ else if (avcC->sps_array [0 ]->vui ->chroma_sample_loc_type_top_field == 3 ) track->chroma_location = CHROMA_LOC_TOP;
597
+ else if (avcC->sps_array [0 ]->vui ->chroma_sample_loc_type_top_field == 4 ) track->chroma_location = CHROMA_LOC_BOTTOMLEFT;
598
+ else if (avcC->sps_array [0 ]->vui ->chroma_sample_loc_type_top_field == 5 ) track->chroma_location = CHROMA_LOC_BOTTOM;
599
+ }
590
600
}
591
601
592
602
if (avcC->pps_count > 0 && avcC->pps_array [0 ])
@@ -634,6 +644,18 @@ bool computeCodecsSpecifics(MediaFile_t *media)
634
644
track->color_depth = vpcC->bitDepth ;
635
645
track->color_range = vpcC->videoFullRangeFlag ;
636
646
647
+ if (vpcC->chromaSubsampling == 0 || vpcC->chromaSubsampling == 1 )
648
+ track->chroma_subsampling = CHROMA_SS_420;
649
+ else if (vpcC->chromaSubsampling == 2 )
650
+ track->chroma_subsampling = CHROMA_SS_422;
651
+ else if (vpcC->chromaSubsampling == 3 )
652
+ track->chroma_subsampling = CHROMA_SS_444;
653
+
654
+ if (vpcC->chromaSubsampling == 1 )
655
+ track->chroma_location = CHROMA_LOC_TOPLEFT;
656
+ else
657
+ track->chroma_location = CHROMA_LOC_LEFT;
658
+
637
659
track->color_primaries = vpcC->colourPrimaries ;
638
660
track->color_transfer = vpcC->transferCharacteristics ;
639
661
track->color_matrix = vpcC->matrixCoefficients ;
@@ -670,9 +692,43 @@ bool computeCodecsSpecifics(MediaFile_t *media)
670
692
else if (av1C->seq_level_idx_0 == 22 ) track->video_level = 7.2 ;
671
693
else if (av1C->seq_level_idx_0 == 23 ) track->video_level = 7.3 ;
672
694
673
- if (av1C->high_bitdepth ) track->color_depth = 10 ;
674
- else if (av1C->twelve_bit ) track->color_depth = 12 ;
695
+ if (av1C->twelve_bit ) track->color_depth = 12 ;
696
+ else if (av1C->high_bitdepth ) track->color_depth = 10 ;
675
697
else track->color_depth = 8 ;
698
+
699
+ if (av1C->chroma_subsampling_x == 0 && av1C->chroma_subsampling_y == 0 && av1C->monochrome == 0 )
700
+ track->chroma_subsampling = CHROMA_SS_444;
701
+ else if (av1C->chroma_subsampling_x == 1 && av1C->chroma_subsampling_y == 0 && av1C->monochrome == 0 )
702
+ track->chroma_subsampling = CHROMA_SS_422;
703
+ else if (av1C->chroma_subsampling_x == 1 && av1C->chroma_subsampling_y == 1 && av1C->monochrome == 0 )
704
+ track->chroma_subsampling = CHROMA_SS_420;
705
+ else if (av1C->chroma_subsampling_x == 1 && av1C->chroma_subsampling_y == 1 && av1C->monochrome == 1 )
706
+ track->chroma_subsampling = CHROMA_SS_400;
707
+
708
+ if (av1C->chroma_sample_position == 1 )
709
+ track->chroma_location = CHROMA_LOC_LEFT;
710
+ else if (av1C->chroma_sample_position == 2 )
711
+ track->chroma_location = CHROMA_LOC_TOPLEFT;
712
+ }
713
+
714
+ else if (track->stream_codec == CODEC_PRORES_422_PROXY ||
715
+ track->stream_codec == CODEC_PRORES_422_LT ||
716
+ track->stream_codec == CODEC_PRORES_422 ||
717
+ track->stream_codec == CODEC_PRORES_422_HQ)
718
+ {
719
+ track->chroma_subsampling = CHROMA_SS_422;
720
+ }
721
+ else if (track->stream_codec == CODEC_PRORES_4444 ||
722
+ track->stream_codec == CODEC_PRORES_4444_XQ)
723
+ {
724
+ track->chroma_subsampling = CHROMA_SS_444;
725
+ }
726
+ else if (track->stream_codec == CODEC_PRORES_RAW ||
727
+ track->stream_codec == CODEC_PRORES_RAW_HQ)
728
+ {
729
+ // RAW variants are not using YUV pixel subsampling
730
+ track->chroma_subsampling = CHROMA_SS_UNKNOWN;
731
+ track->color_depth = 16 ;
676
732
}
677
733
}
678
734
}
0 commit comments