@libmedia/avutil 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/codecs/h264.cjs +8 -3
- package/dist/cjs/codecs/h264.js.map +1 -1
- package/dist/cjs/codecs/hevc.cjs +3 -3
- package/dist/cjs/codecs/hevc.js.map +1 -1
- package/dist/cjs/codecs/mpeg4.cjs +1 -1
- package/dist/cjs/codecs/mpeg4.js.map +1 -1
- package/dist/cjs/codecs/mpegvideo.cjs +1 -1
- package/dist/cjs/codecs/mpegvideo.js.map +1 -1
- package/dist/cjs/codecs/vp8.cjs +1 -1
- package/dist/cjs/codecs/vp8.js.map +1 -1
- package/dist/cjs/codecs/vp9.cjs +1 -1
- package/dist/cjs/codecs/vp9.js.map +1 -1
- package/dist/cjs/codecs/vvc.cjs +3 -3
- package/dist/cjs/codecs/vvc.js.map +1 -1
- package/dist/cjs/function/audioData2AVFrame.cjs +7 -9
- package/dist/cjs/function/audioData2AVFrame.js.map +1 -1
- package/dist/cjs/function/avframe2VideoFrame.cjs +3 -2
- package/dist/cjs/function/avframe2VideoFrame.js.map +1 -1
- package/dist/cjs/function/videoFrame2AVFrame.cjs +12 -18
- package/dist/cjs/function/videoFrame2AVFrame.js.map +1 -1
- package/dist/esm/codecs/h264.d.ts +8 -1
- package/dist/esm/codecs/h264.js +8 -3
- package/dist/esm/codecs/h264.js.map +1 -1
- package/dist/esm/codecs/hevc.d.ts +8 -1
- package/dist/esm/codecs/hevc.js +3 -3
- package/dist/esm/codecs/hevc.js.map +1 -1
- package/dist/esm/codecs/mpeg4.d.ts +7 -1
- package/dist/esm/codecs/mpeg4.js +1 -1
- package/dist/esm/codecs/mpeg4.js.map +1 -1
- package/dist/esm/codecs/mpegvideo.d.ts +7 -1
- package/dist/esm/codecs/mpegvideo.js +1 -1
- package/dist/esm/codecs/mpegvideo.js.map +1 -1
- package/dist/esm/codecs/vp8.d.ts +7 -1
- package/dist/esm/codecs/vp8.js +1 -1
- package/dist/esm/codecs/vp8.js.map +1 -1
- package/dist/esm/codecs/vp9.d.ts +7 -1
- package/dist/esm/codecs/vp9.js +1 -1
- package/dist/esm/codecs/vp9.js.map +1 -1
- package/dist/esm/codecs/vvc.d.ts +8 -1
- package/dist/esm/codecs/vvc.js +3 -3
- package/dist/esm/codecs/vvc.js.map +1 -1
- package/dist/esm/function/audioData2AVFrame.d.ts +1 -1
- package/dist/esm/function/audioData2AVFrame.js +8 -11
- package/dist/esm/function/audioData2AVFrame.js.map +1 -1
- package/dist/esm/function/avframe2VideoFrame.d.ts +1 -1
- package/dist/esm/function/avframe2VideoFrame.js +3 -3
- package/dist/esm/function/avframe2VideoFrame.js.map +1 -1
- package/dist/esm/function/videoFrame2AVFrame.d.ts +1 -1
- package/dist/esm/function/videoFrame2AVFrame.js +12 -21
- package/dist/esm/function/videoFrame2AVFrame.js.map +1 -1
- package/package.json +3 -3
- package/src/codecs/h264.ts +17 -1
- package/src/codecs/hevc.ts +15 -3
- package/src/codecs/mpeg4.ts +7 -1
- package/src/codecs/mpegvideo.ts +7 -1
- package/src/codecs/vp8.ts +7 -1
- package/src/codecs/vp9.ts +7 -1
- package/src/codecs/vvc.ts +15 -3
- package/src/function/audioData2AVFrame.ts +3 -3
- package/src/function/avframe2VideoFrame.ts +6 -3
- package/src/function/videoFrame2AVFrame.ts +3 -3
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import { CTypeEnumRead as cheap__CTypeEnumRead__0 } from "@libmedia/cheap/internal";
|
|
2
|
-
|
|
3
|
-
import { CTypeEnumWrite as cheap__CTypeEnumWrite__1 } from "@libmedia/cheap/internal";
|
|
4
|
-
|
|
5
1
|
import { createAVFrame, getVideoBuffer, unrefAVFrame } from "../util/avframe.js";
|
|
6
2
|
|
|
7
3
|
import { getAVPixelFormatDescriptor } from "../pixelFormatDescriptor.js";
|
|
@@ -29,24 +25,19 @@ export function mapColorTrc(colorTrc) {
|
|
|
29
25
|
}
|
|
30
26
|
|
|
31
27
|
export async function videoFrame2AVFrame(videoFrame, avframe = 0) {
|
|
32
|
-
0 === avframe ? avframe = createAVFrame() : unrefAVFrame(avframe),
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
videoFrame.visibleRect && (cheap__CTypeEnumWrite__1[25](avframe + 276, videoFrame.visibleRect.left),
|
|
43
|
-
cheap__CTypeEnumWrite__1[25](avframe + 280, videoFrame.codedWidth - videoFrame.visibleRect.right),
|
|
44
|
-
cheap__CTypeEnumWrite__1[25](avframe + 268, videoFrame.visibleRect.top), cheap__CTypeEnumWrite__1[25](avframe + 272, videoFrame.codedHeight - videoFrame.visibleRect.bottom)),
|
|
45
|
-
getVideoBuffer(avframe);
|
|
46
|
-
const des = getAVPixelFormatDescriptor(cheap__CTypeEnumRead__0[15](avframe + 80)), layout = [];
|
|
28
|
+
0 === avframe ? avframe = createAVFrame() : unrefAVFrame(avframe), avframe.format = mapPixelFormat(videoFrame.format),
|
|
29
|
+
avframe.pts = BigInt(Math.floor(videoFrame.timestamp)), avframe.bestEffortTimestamp = avframe.pts,
|
|
30
|
+
avframe.width = videoFrame.codedWidth, avframe.height = videoFrame.codedHeight,
|
|
31
|
+
avframe.duration = BigInt(Math.floor(videoFrame.duration)), avframe.timeBase.den = AV_TIME_BASE,
|
|
32
|
+
avframe.timeBase.num = 1, avframe.colorSpace = mapColorSpace(videoFrame.colorSpace.matrix),
|
|
33
|
+
avframe.colorPrimaries = mapColorPrimaries(videoFrame.colorSpace.primaries), avframe.colorTrc = mapColorTrc(videoFrame.colorSpace.transfer),
|
|
34
|
+
avframe.colorRange = videoFrame.colorSpace.fullRange ? 2 : 1, videoFrame.visibleRect && (avframe.cropLeft = videoFrame.visibleRect.left,
|
|
35
|
+
avframe.cropRight = videoFrame.codedWidth - videoFrame.visibleRect.right, avframe.cropTop = videoFrame.visibleRect.top,
|
|
36
|
+
avframe.cropBottom = videoFrame.codedHeight - videoFrame.visibleRect.bottom), getVideoBuffer(avframe);
|
|
37
|
+
const des = getAVPixelFormatDescriptor(avframe.format), layout = [];
|
|
47
38
|
for (let i = 0; i < des.comp.length; i++) des.comp[i].plane >= i && layout.push({
|
|
48
|
-
offset:
|
|
49
|
-
stride:
|
|
39
|
+
offset: avframe.data[i],
|
|
40
|
+
stride: avframe.linesize[i]
|
|
50
41
|
});
|
|
51
42
|
return await videoFrame.copyTo(getHeap(), {
|
|
52
43
|
layout: layout
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createAVFrame","getVideoBuffer","unrefAVFrame","getAVPixelFormatDescriptor","getHeap","AV_TIME_BASE","pixelFormatMap","colorPrimariesMap","colorSpaceMap","colorTrcMap","mapPixelFormat","format","mapColorSpace","colorSpace","mapColorPrimaries","colorPrimaries","mapColorTrc","colorTrc","async","videoFrame2AVFrame","videoFrame","avframe","
|
|
1
|
+
{"version":3,"names":["createAVFrame","getVideoBuffer","unrefAVFrame","getAVPixelFormatDescriptor","getHeap","AV_TIME_BASE","pixelFormatMap","colorPrimariesMap","colorSpaceMap","colorTrcMap","mapPixelFormat","format","mapColorSpace","colorSpace","mapColorPrimaries","colorPrimaries","mapColorTrc","colorTrc","async","videoFrame2AVFrame","videoFrame","avframe","pts","BigInt","Math","floor","timestamp","bestEffortTimestamp","width","codedWidth","height","codedHeight","duration","timeBase","den","num","matrix","primaries","transfer","colorRange","fullRange","visibleRect","cropLeft","left","cropRight","right","cropTop","top","cropBottom","bottom","des","layout","i","comp","length","plane","push","offset","data","stride","linesize","copyTo"],"sources":["../../../src/function/videoFrame2AVFrame.ts"],"mappings":"SAwBSA,eAAeC,gBAAgBC,oBAAc;;SAG7CC,kCAA4B;;SAC5BC,eAAS;;SACTC,oBAAc;;SACdC,gBAAgBC,mBAAmBC,eAAeC,mBAAa;;OAElE,SAAUC,eAAeC;IAC7B,OAAOL,eAAeK,YAAO;AAC/B;;OAEM,SAAUC,cAAcC;IAC5B,OAAOL,cAAcK,eAAW;AAClC;;OAEM,SAAUC,kBAAkBC;IAChC,OAAOR,kBAAkBQ,mBAAe;AAC1C;;OAEM,SAAUC,YAAYC;IAC1B,OAAOR,YAAYQ,aAAS;AAC9B;;OAEOC,eAAeC,mBAAkEC,YAAwBC,UAAA;IACnG,MAAPA,UACFA,UAAUrB,kBAGVE,aAAamB,UAGfA,QAAQV,SAASD,eAAeU,WAAWT;IAC3CU,QAAQC,MAAGC,OAAAC,KAAAC,MAAsBL,WAAWM,aAC5CL,QAAQM,sBAAsBN,QAAQC;IACtCD,QAAQO,QAAQR,WAAWS,YAC3BR,QAAQS,SAASV,WAAWW;IAC5BV,QAAQW,WAAQT,OAAAC,KAAAC,MAAsBL,WAAWY,YACjDX,QAAQY,SAASC,MAAM7B;IACvBgB,QAAQY,SAASE,MAAM,GAEvBd,QAAQR,aAAaD,cAAcQ,WAAWP,WAAWuB;IACzDf,QAAQN,iBAAiBD,kBAAkBM,WAAWP,WAAWwB,YACjEhB,QAAQJ,WAAWD,YAAYI,WAAWP,WAAWyB;IACrDjB,QAAQkB,aAAanB,WAAWP,WAAW2B,YAAW,IAAgC,GAElFpB,WAAWqB,gBACbpB,QAAQqB,WAAkCtB,WAAWqB,YAAYE;IACjEtB,QAAQuB,YAAmCxB,WAAWS,aAAaT,WAAWqB,YAAYI,OAC1FxB,QAAQyB,UAAiC1B,WAAWqB,YAAYM;IAChE1B,QAAQ2B,aAAoC5B,WAAWW,cAAcX,WAAWqB,YAAYQ,SAG9FhD,eAAeoB;IAEf,MAAM6B,MAAM/C,2BAA2BkB,QAAQV,SACzCwC,SAAwB;IAC9B,KAAK,IAAIC,IAAI,GAAGA,IAAIF,IAAIG,KAAKC,QAAQF,KAC/BF,IAAIG,KAAKD,GAAGG,SAASH,KACvBD,OAAOK,KAAK;QACVC,QAAmDpC,QAAQqC,KAAKN;QAChEO,QAAQtC,QAAQuC,SAASR;;IAQ/B,aAJMhC,WAAWyC,OAAOzD,WAAW;QACjC+C;QAGK9B;AACT","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libmedia/avutil",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "libmedia 工具模块",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"repository": {
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
"author": "Gaoxing Zhao",
|
|
19
19
|
"license": "LGPL-3.0-or-later",
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@libmedia/common": "~2.
|
|
22
|
-
"@libmedia/cheap": "~1.
|
|
21
|
+
"@libmedia/common": "~2.3.0",
|
|
22
|
+
"@libmedia/cheap": "~1.3.0"
|
|
23
23
|
},
|
|
24
24
|
"type": "module",
|
|
25
25
|
"types": "./dist/esm/index.d.ts",
|
package/src/codecs/h264.ts
CHANGED
|
@@ -662,12 +662,22 @@ export function parseAVCodecParameters(
|
|
|
662
662
|
}
|
|
663
663
|
}
|
|
664
664
|
|
|
665
|
-
|
|
665
|
+
/**
|
|
666
|
+
* 判断是否是随机访问点
|
|
667
|
+
*
|
|
668
|
+
* @param avpacket
|
|
669
|
+
* @param naluLengthSize
|
|
670
|
+
* @returns
|
|
671
|
+
*/
|
|
672
|
+
export function isRAP(avpacket: pointer<AVPacket>, naluLengthSize: int32 = 4) {
|
|
666
673
|
if (avpacket.flags & AVPacketFlags.AV_PKT_FLAG_H26X_ANNEXB) {
|
|
667
674
|
let nalus = naluUtil.splitNaluByStartCode(mapUint8Array(avpacket.data, reinterpret_cast<size>(avpacket.size)))
|
|
668
675
|
return nalus.some((nalu) => {
|
|
669
676
|
const type = nalu[0] & 0x1f
|
|
670
677
|
return type === H264NaluType.kSliceIDR
|
|
678
|
+
// H.264 Recovery Point SEI
|
|
679
|
+
|| type === H264NaluType.kSliceSEI
|
|
680
|
+
&& nalu[1] === 6
|
|
671
681
|
})
|
|
672
682
|
}
|
|
673
683
|
else {
|
|
@@ -678,6 +688,12 @@ export function isIDR(avpacket: pointer<AVPacket>, naluLengthSize: int32 = 4) {
|
|
|
678
688
|
if (type === H264NaluType.kSliceIDR) {
|
|
679
689
|
return true
|
|
680
690
|
}
|
|
691
|
+
// H.264 Recovery Point SEI
|
|
692
|
+
if (type === H264NaluType.kSliceSEI
|
|
693
|
+
&& intread.r8(avpacket.data + (i + naluLengthSize) + 1) === 6
|
|
694
|
+
) {
|
|
695
|
+
return true
|
|
696
|
+
}
|
|
681
697
|
if (naluLengthSize === 4) {
|
|
682
698
|
i += intread.rb32(avpacket.data + i)
|
|
683
699
|
}
|
package/src/codecs/hevc.ts
CHANGED
|
@@ -702,12 +702,21 @@ export function parseAVCodecParameters(
|
|
|
702
702
|
}
|
|
703
703
|
}
|
|
704
704
|
|
|
705
|
-
|
|
705
|
+
/**
|
|
706
|
+
* 判断是否是随机访问点
|
|
707
|
+
*
|
|
708
|
+
* @param avpacket
|
|
709
|
+
* @param naluLengthSize
|
|
710
|
+
* @returns
|
|
711
|
+
*/
|
|
712
|
+
export function isRAP(avpacket: pointer<AVPacket>, naluLengthSize: int32 = 4) {
|
|
706
713
|
if (avpacket.flags & AVPacketFlags.AV_PKT_FLAG_H26X_ANNEXB) {
|
|
707
714
|
let nalus = naluUtil.splitNaluByStartCode(mapUint8Array(avpacket.data, reinterpret_cast<size>(avpacket.size)))
|
|
708
715
|
return nalus.some((nalu) => {
|
|
709
716
|
const type = (nalu[0] >>> 1) & 0x3f
|
|
710
|
-
return type === HEVCNaluType.kSliceIDR_N_LP
|
|
717
|
+
return type === HEVCNaluType.kSliceIDR_N_LP
|
|
718
|
+
|| type === HEVCNaluType.kSliceIDR_W_RADL
|
|
719
|
+
|| type === HEVCNaluType.kSliceCRA_NUT
|
|
711
720
|
})
|
|
712
721
|
}
|
|
713
722
|
else {
|
|
@@ -715,7 +724,10 @@ export function isIDR(avpacket: pointer<AVPacket>, naluLengthSize: int32 = 4) {
|
|
|
715
724
|
let i = 0
|
|
716
725
|
while (i < (size - naluLengthSize)) {
|
|
717
726
|
const type = (intread.r8(avpacket.data + (i + naluLengthSize)) >>> 1) & 0x3f
|
|
718
|
-
if (type === HEVCNaluType.kSliceIDR_N_LP
|
|
727
|
+
if (type === HEVCNaluType.kSliceIDR_N_LP
|
|
728
|
+
|| type === HEVCNaluType.kSliceIDR_W_RADL
|
|
729
|
+
|| type === HEVCNaluType.kSliceCRA_NUT
|
|
730
|
+
) {
|
|
719
731
|
return true
|
|
720
732
|
}
|
|
721
733
|
if (naluLengthSize === 4) {
|
package/src/codecs/mpeg4.ts
CHANGED
|
@@ -31,7 +31,13 @@ export const enum Mpeg4PictureType {
|
|
|
31
31
|
B
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
/**
|
|
35
|
+
* 判断是否是随机访问点
|
|
36
|
+
*
|
|
37
|
+
* @param avpacket
|
|
38
|
+
* @returns
|
|
39
|
+
*/
|
|
40
|
+
export function isRAP(avpacket: pointer<AVPacket>) {
|
|
35
41
|
const byte = accessof(reinterpret_cast<pointer<uint8>>(avpacket.data + 4))
|
|
36
42
|
return (byte >>> 6) === Mpeg4PictureType.I
|
|
37
43
|
}
|
package/src/codecs/mpegvideo.ts
CHANGED
|
@@ -32,7 +32,13 @@ export const enum MpegVideoPictureType {
|
|
|
32
32
|
B
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
/**
|
|
36
|
+
* 判断是否是随机访问点
|
|
37
|
+
*
|
|
38
|
+
* @param avpacket
|
|
39
|
+
* @returns
|
|
40
|
+
*/
|
|
41
|
+
export function isRAP(avpacket: pointer<AVPacket>) {
|
|
36
42
|
const data = getAVPacketData(avpacket)
|
|
37
43
|
|
|
38
44
|
for (let i = 0; i < data.length - 6; i++) {
|
package/src/codecs/vp8.ts
CHANGED
|
@@ -85,7 +85,13 @@ export function parseExtraData(extradata: Uint8ArrayInterface) {
|
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
|
|
88
|
+
/**
|
|
89
|
+
* 判断是否是随机访问点
|
|
90
|
+
*
|
|
91
|
+
* @param avpacket
|
|
92
|
+
* @returns
|
|
93
|
+
*/
|
|
94
|
+
export function isRAP(avpacket: pointer<AVPacket>) {
|
|
89
95
|
const first = accessof(avpacket.data)
|
|
90
96
|
return !(first >>> 7)
|
|
91
97
|
}
|
package/src/codecs/vp9.ts
CHANGED
|
@@ -196,7 +196,13 @@ export function generateExtradata(codecpar: pointer<AVCodecParameters>) {
|
|
|
196
196
|
return ioWriter.getWroteBuffer()
|
|
197
197
|
}
|
|
198
198
|
|
|
199
|
-
|
|
199
|
+
/**
|
|
200
|
+
* 判断是否是随机访问点
|
|
201
|
+
*
|
|
202
|
+
* @param avpacket
|
|
203
|
+
* @returns
|
|
204
|
+
*/
|
|
205
|
+
export function isRAP(avpacket: pointer<AVPacket>) {
|
|
200
206
|
const first = accessof(avpacket.data)
|
|
201
207
|
|
|
202
208
|
const version = (first >>> 5) & 0x01
|
package/src/codecs/vvc.ts
CHANGED
|
@@ -807,12 +807,21 @@ export function parseAVCodecParameters(
|
|
|
807
807
|
}
|
|
808
808
|
}
|
|
809
809
|
|
|
810
|
-
|
|
810
|
+
/**
|
|
811
|
+
* 判断是否是随机访问点
|
|
812
|
+
*
|
|
813
|
+
* @param avpacket
|
|
814
|
+
* @param naluLengthSize
|
|
815
|
+
* @returns
|
|
816
|
+
*/
|
|
817
|
+
export function isRAP(avpacket: pointer<AVPacket>, naluLengthSize: int32 = 4) {
|
|
811
818
|
if (avpacket.flags & AVPacketFlags.AV_PKT_FLAG_H26X_ANNEXB) {
|
|
812
819
|
let nalus = naluUtil.splitNaluByStartCode(mapUint8Array(avpacket.data, reinterpret_cast<size>(avpacket.size)))
|
|
813
820
|
return nalus.some((nalu) => {
|
|
814
821
|
const type = (nalu[1] >>> 3) & 0x1f
|
|
815
|
-
return type === VVCNaluType.kIDR_N_LP
|
|
822
|
+
return type === VVCNaluType.kIDR_N_LP
|
|
823
|
+
|| type === VVCNaluType.kIDR_W_RADL
|
|
824
|
+
|| type === VVCNaluType.kCRA_NUT
|
|
816
825
|
})
|
|
817
826
|
}
|
|
818
827
|
else {
|
|
@@ -820,7 +829,10 @@ export function isIDR(avpacket: pointer<AVPacket>, naluLengthSize: int32 = 4) {
|
|
|
820
829
|
let i = 0
|
|
821
830
|
while (i < (size - naluLengthSize)) {
|
|
822
831
|
const type = (intread.r8(avpacket.data + (i + naluLengthSize + 1)) >>> 3) & 0x1f
|
|
823
|
-
if (type === VVCNaluType.kIDR_N_LP
|
|
832
|
+
if (type === VVCNaluType.kIDR_N_LP
|
|
833
|
+
|| type === VVCNaluType.kIDR_W_RADL
|
|
834
|
+
|| type === VVCNaluType.kCRA_NUT
|
|
835
|
+
) {
|
|
824
836
|
return true
|
|
825
837
|
}
|
|
826
838
|
if (naluLengthSize === 4) {
|
|
@@ -53,9 +53,9 @@ function mapFormat(format: AudioSampleFormat) {
|
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
export function audioData2AVFrame(audioData: AudioData, avframe:
|
|
56
|
+
export function audioData2AVFrame<T extends pointer<AVFrame> = pointer<AVFrame>>(audioData: AudioData, avframe: T = nullptr) {
|
|
57
57
|
if (avframe === nullptr) {
|
|
58
|
-
avframe = createAVFrame()
|
|
58
|
+
avframe = createAVFrame() as T
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
avframe.sampleRate = audioData.sampleRate
|
|
@@ -78,5 +78,5 @@ export function audioData2AVFrame(audioData: AudioData, avframe: pointer<AVFrame
|
|
|
78
78
|
})
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
return avframe
|
|
81
|
+
return avframe as T
|
|
82
82
|
}
|
|
@@ -25,9 +25,9 @@
|
|
|
25
25
|
|
|
26
26
|
import type AVFrame from '../struct/avframe'
|
|
27
27
|
import { getAVPixelFormatDescriptor } from '../pixelFormatDescriptor'
|
|
28
|
-
import { AVColorRange,
|
|
28
|
+
import { AVColorRange, AVPixelFormat } from '../pixfmt'
|
|
29
29
|
import { avRescaleQ2 } from '../util/rational'
|
|
30
|
-
import { AV_TIME_BASE_Q } from '../constant'
|
|
30
|
+
import { AV_TIME_BASE_Q, NOPTS_VALUE_BIGINT } from '../constant'
|
|
31
31
|
import { getHeap } from '@libmedia/cheap/internal'
|
|
32
32
|
import { object } from '@libmedia/common'
|
|
33
33
|
import { pixelFormatMap, colorPrimariesMap, colorSpaceMap, colorTrcMap } from './constant/webcodecs'
|
|
@@ -38,6 +38,9 @@ const colorSpaceMapReverse = object.reverse(colorSpaceMap)
|
|
|
38
38
|
const colorTrcMapReverse = object.reverse(colorTrcMap)
|
|
39
39
|
|
|
40
40
|
export function avPixelFormat2Format(pixfmt: AVPixelFormat) {
|
|
41
|
+
if (pixfmt === AVPixelFormat.AV_PIX_FMT_YUVJ420P) {
|
|
42
|
+
return 'I420'
|
|
43
|
+
}
|
|
41
44
|
return pixelFormatMapReverse[pixfmt] ?? null
|
|
42
45
|
}
|
|
43
46
|
|
|
@@ -74,7 +77,7 @@ export function avframe2VideoFrame(avframe: pointer<AVFrame>, pts?: int64, video
|
|
|
74
77
|
codedHeight: height,
|
|
75
78
|
timestamp: pts ? static_cast<double>(pts) : static_cast<double>(avRescaleQ2(avframe.pts, addressof(avframe.timeBase), AV_TIME_BASE_Q)),
|
|
76
79
|
format: avPixelFormat2Format(avframe.format),
|
|
77
|
-
duration: static_cast<double>(avRescaleQ2(avframe.duration, addressof(avframe.timeBase), AV_TIME_BASE_Q)),
|
|
80
|
+
duration: avframe.duration !== NOPTS_VALUE_BIGINT ? static_cast<double>(avRescaleQ2(avframe.duration, addressof(avframe.timeBase), AV_TIME_BASE_Q)) : null,
|
|
78
81
|
layout,
|
|
79
82
|
colorSpace: getVideoColorSpaceInit(avframe),
|
|
80
83
|
visibleRect: {
|
|
@@ -46,9 +46,9 @@ export function mapColorTrc(colorTrc: VideoTransferCharacteristics) {
|
|
|
46
46
|
return colorTrcMap[colorTrc] ?? AVColorTransferCharacteristic.AVCOL_TRC_BT709
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
export async function videoFrame2AVFrame(videoFrame: VideoFrame, avframe:
|
|
49
|
+
export async function videoFrame2AVFrame<T extends pointer<AVFrame> = pointer<AVFrame>>(videoFrame: VideoFrame, avframe: T = nullptr) {
|
|
50
50
|
if (avframe === nullptr) {
|
|
51
|
-
avframe = createAVFrame()
|
|
51
|
+
avframe = createAVFrame() as T
|
|
52
52
|
}
|
|
53
53
|
else {
|
|
54
54
|
unrefAVFrame(avframe)
|
|
@@ -91,5 +91,5 @@ export async function videoFrame2AVFrame(videoFrame: VideoFrame, avframe: pointe
|
|
|
91
91
|
layout
|
|
92
92
|
})
|
|
93
93
|
|
|
94
|
-
return avframe
|
|
94
|
+
return avframe as T
|
|
95
95
|
}
|