@@ -78,12 +78,13 @@ shaka.transmuxer.H265 = class {
78
78
spsConfiguration . generalConstraintIndicatorFlags5 ,
79
79
generalConstraintIndicatorFlags6 :
80
80
spsConfiguration . generalConstraintIndicatorFlags6 ,
81
- constantFrameRate : spsConfiguration . constantFrameRate ,
82
81
minSpatialSegmentationIdc : spsConfiguration . minSpatialSegmentationIdc ,
83
82
chromaFormatIdc : spsConfiguration . chromaFormatIdc ,
84
83
bitDepthLumaMinus8 : spsConfiguration . bitDepthLumaMinus8 ,
85
84
bitDepthChromaMinus8 : spsConfiguration . bitDepthChromaMinus8 ,
86
85
parallelismType : ppsConfiguration . parallelismType ,
86
+ frameRateFps : spsConfiguration . frameRateFps ,
87
+ frameRateFixed : spsConfiguration . frameRateFixed ,
87
88
} ;
88
89
89
90
const videoConfig = H265 . getVideoConfiguration_ (
@@ -308,6 +309,9 @@ shaka.transmuxer.H265 = class {
308
309
let defaultDisplayWindowFlag = false ; // for calc offset
309
310
let sarWidth = 1 ;
310
311
let sarHeight = 1 ;
312
+ let fixedPicRateGeneralFlag = true ;
313
+ let fpsDen = 1 ;
314
+ let fpsNum = 0 ;
311
315
let minSpatialSegmentationIdc = 0 ; // for hvcC
312
316
gb . readBoolean ( ) ; // sps_temporal_mvp_enabled_flag
313
317
gb . readBoolean ( ) ; // strong_intra_smoothing_enabled_flag
@@ -355,15 +359,15 @@ shaka.transmuxer.H265 = class {
355
359
gb . readBoolean ( ) ; // frame_field_info_present_flag
356
360
defaultDisplayWindowFlag = gb . readBoolean ( ) ;
357
361
if ( defaultDisplayWindowFlag ) {
358
- gb . readUnsignedExpGolomb ( ) ;
359
- gb . readUnsignedExpGolomb ( ) ;
360
- gb . readUnsignedExpGolomb ( ) ;
361
- gb . readUnsignedExpGolomb ( ) ;
362
+ leftOffset += gb . readUnsignedExpGolomb ( ) ;
363
+ rightOffset += gb . readUnsignedExpGolomb ( ) ;
364
+ topOffset += gb . readUnsignedExpGolomb ( ) ;
365
+ bottomOffset += gb . readUnsignedExpGolomb ( ) ;
362
366
}
363
367
const vuiTimingInfoPresentFlag = gb . readBoolean ( ) ;
364
368
if ( vuiTimingInfoPresentFlag ) {
365
- gb . readBits ( 32 ) ; // fps_den
366
- gb . readBits ( 32 ) ; // fps_num
369
+ fpsDen = gb . readBits ( 32 ) ;
370
+ fpsNum = gb . readBits ( 32 ) ;
367
371
const vuiPocProportionalToTimingFlag = gb . readBoolean ( ) ;
368
372
if ( vuiPocProportionalToTimingFlag ) {
369
373
gb . readUnsignedExpGolomb ( ) ;
@@ -396,7 +400,7 @@ shaka.transmuxer.H265 = class {
396
400
}
397
401
}
398
402
for ( let i = 0 ; i <= maxSubLayersMinus1 ; i ++ ) {
399
- const fixedPicRateGeneralFlag = gb . readBoolean ( ) ;
403
+ fixedPicRateGeneralFlag = gb . readBoolean ( ) ;
400
404
let fixedPicRateWithinCvsFlag = true ;
401
405
let cpbCnt = 1 ;
402
406
if ( ! fixedPicRateGeneralFlag ) {
@@ -472,14 +476,15 @@ shaka.transmuxer.H265 = class {
472
476
generalConstraintIndicatorFlags5,
473
477
generalConstraintIndicatorFlags6,
474
478
minSpatialSegmentationIdc,
475
- constantFrameRate : 0 , // FIXME!!!
476
479
chromaFormatIdc,
477
480
bitDepthLumaMinus8,
478
481
bitDepthChromaMinus8,
479
482
width : codecWidth ,
480
483
height : codecHeight ,
481
484
sarWidth : sarWidth ,
482
485
sarHeight : sarHeight ,
486
+ frameRateFps : fpsNum / fpsDen ,
487
+ frameRateFixed : fixedPicRateGeneralFlag ,
483
488
} ;
484
489
}
485
490
@@ -545,8 +550,6 @@ shaka.transmuxer.H265 = class {
545
550
* @private
546
551
*/
547
552
static getVideoConfiguration_ ( vps , sps , pps , detail ) {
548
- const H265 = shaka . transmuxer . H265 ;
549
-
550
553
const length = 23 + ( 3 + 2 + vps . byteLength ) +
551
554
( 3 + 2 + sps . byteLength ) + ( 3 + 2 + pps . byteLength ) ;
552
555
const data = new Uint8Array ( length ) ;
@@ -574,33 +577,34 @@ shaka.transmuxer.H265 = class {
574
577
data [ 17 ] = 0xF8 | ( detail . bitDepthLumaMinus8 & 0x07 ) ;
575
578
data [ 18 ] = 0xF8 | ( detail . bitDepthChromaMinus8 & 0x07 ) ;
576
579
data [ 19 ] = 0 ;
577
- data [ 20 ] = 0 ;
578
- data [ 21 ] = ( ( detail . constantFrameRate & 0x03 ) << 6 ) |
580
+ data [ 20 ] = parseInt ( detail . frameRateFps , 10 ) ;
581
+ data [ 21 ] = ( ( ( detail . frameRateFixed ? 1 : 0 ) & 0x03 ) << 6 ) |
579
582
( ( detail . numTemporalLayers & 0x07 ) << 3 ) |
580
583
( ( detail . temporalIdNested ? 1 : 0 ) << 2 ) | 3 ;
581
584
data [ 22 ] = 3 ;
582
- data [ 23 + 0 + 0 ] = 0x80 | H265 . NALU_TYPE_VPS_ ;
583
- data [ 23 + 0 + 1 ] = 0 ;
584
- data [ 23 + 0 + 2 ] = 1 ;
585
- data [ 23 + 0 + 3 ] = ( vps . byteLength & 0xFF00 ) >> 8 ;
586
- data [ 23 + 0 + 4 ] = ( vps . byteLength & 0x00FF ) >> 0 ;
587
- data . set ( vps , 23 + 0 + 5 ) ;
588
- data [ 23 + ( 5 + vps . byteLength ) + 0 ] =
589
- 0x80 | H265 . NALU_TYPE_SPS_ ;
590
- data [ 23 + ( 5 + vps . byteLength ) + 1 ] = 0 ;
591
- data [ 23 + ( 5 + vps . byteLength ) + 2 ] = 1 ;
592
- data [ 23 + ( 5 + vps . byteLength ) + 3 ] = ( sps . byteLength & 0xFF00 ) >> 8 ;
593
- data [ 23 + ( 5 + vps . byteLength ) + 4 ] = ( sps . byteLength & 0x00FF ) >> 0 ;
594
- data . set ( sps , 23 + ( 5 + vps . byteLength ) + 5 ) ;
595
- data [ 23 + ( 5 + vps . byteLength + 5 + sps . byteLength ) + 0 ] =
596
- 0x80 | H265 . NALU_TYPE_PPS_ ;
597
- data [ 23 + ( 5 + vps . byteLength + 5 + sps . byteLength ) + 1 ] = 0 ;
598
- data [ 23 + ( 5 + vps . byteLength + 5 + sps . byteLength ) + 2 ] = 1 ;
599
- data [ 23 + ( 5 + vps . byteLength + 5 + sps . byteLength ) + 3 ] =
600
- ( pps . byteLength & 0xFF00 ) >> 8 ;
601
- data [ 23 + ( 5 + vps . byteLength + 5 + sps . byteLength ) + 4 ] =
602
- ( pps . byteLength & 0x00FF ) >> 0 ;
603
- data . set ( pps , 23 + ( 5 + vps . byteLength + 5 + sps . byteLength ) + 5 ) ;
585
+
586
+ const units = [ vps , sps , pps ] ;
587
+ let offset = 23 ;
588
+ const iMax = units . length - 1 ;
589
+ for ( let i = 0 ; i < units . length ; i += 1 ) {
590
+ data . set (
591
+ new Uint8Array ( [
592
+ ( 32 + i ) | ( i === iMax ? 128 : 0 ) ,
593
+ 0x00 ,
594
+ 0x01 ,
595
+ ] ) ,
596
+ offset ,
597
+ ) ;
598
+ offset += 3 ;
599
+ data . set (
600
+ new Uint8Array ( [ units [ i ] . byteLength >> 8 , units [ i ] . byteLength & 255 ] ) ,
601
+ offset ,
602
+ ) ;
603
+ offset += 2 ;
604
+ data . set ( units [ i ] , offset ) ;
605
+ offset += units [ i ] . byteLength ;
606
+ }
607
+
604
608
return data ;
605
609
}
606
610
@@ -788,7 +792,6 @@ shaka.transmuxer.H265.VPSConfiguration;
788
792
* generalConstraintIndicatorFlags4: number,
789
793
* generalConstraintIndicatorFlags5: number,
790
794
* generalConstraintIndicatorFlags6: number,
791
- * constantFrameRate: number,
792
795
* minSpatialSegmentationIdc: number,
793
796
* chromaFormatIdc: number,
794
797
* bitDepthLumaMinus8: number,
@@ -797,6 +800,8 @@ shaka.transmuxer.H265.VPSConfiguration;
797
800
* height: number,
798
801
* sarWidth: number,
799
802
* sarHeight: number,
803
+ * frameRateFps: number,
804
+ * frameRateFixed: boolean,
800
805
* }}
801
806
*
802
807
* @property {number } generalProfileSpace
@@ -813,7 +818,6 @@ shaka.transmuxer.H265.VPSConfiguration;
813
818
* @property {number } generalConstraintIndicatorFlags4
814
819
* @property {number } generalConstraintIndicatorFlags5
815
820
* @property {number } generalConstraintIndicatorFlags6
816
- * @property {number } constantFrameRate
817
821
* @property {number } minSpatialSegmentationIdc
818
822
* @property {number } chromaFormatIdc
819
823
* @property {number } bitDepthLumaMinus8
@@ -822,6 +826,8 @@ shaka.transmuxer.H265.VPSConfiguration;
822
826
* @property {number } height
823
827
* @property {number } sarWidth
824
828
* @property {number } sarHeight
829
+ * @property {number } frameRateFps
830
+ * @property {boolean } frameRateFixed
825
831
*/
826
832
shaka . transmuxer . H265 . SPSConfiguration ;
827
833
@@ -854,12 +860,13 @@ shaka.transmuxer.H265.PPSConfiguration;
854
860
* generalConstraintIndicatorFlags4: number,
855
861
* generalConstraintIndicatorFlags5: number,
856
862
* generalConstraintIndicatorFlags6: number,
857
- * constantFrameRate: number,
858
863
* minSpatialSegmentationIdc: number,
859
864
* chromaFormatIdc: number,
860
865
* bitDepthLumaMinus8: number,
861
866
* bitDepthChromaMinus8: number,
862
867
* parallelismType: number,
868
+ * frameRateFps: number,
869
+ * frameRateFixed: boolean,
863
870
* }}
864
871
*
865
872
* @property {number } numTemporalLayers
@@ -878,11 +885,12 @@ shaka.transmuxer.H265.PPSConfiguration;
878
885
* @property {number } generalConstraintIndicatorFlags4
879
886
* @property {number } generalConstraintIndicatorFlags5
880
887
* @property {number } generalConstraintIndicatorFlags6
881
- * @property {number } constantFrameRate
882
888
* @property {number } minSpatialSegmentationIdc
883
889
* @property {number } chromaFormatIdc
884
890
* @property {number } bitDepthLumaMinus8
885
891
* @property {number } bitDepthChromaMinus8
886
892
* @property {number } parallelismType
893
+ * @property {number } frameRateFps
894
+ * @property {boolean } frameRateFixed
887
895
*/
888
896
shaka . transmuxer . H265 . DecoderConfigurationRecordType ;
0 commit comments