@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.
Files changed (61) hide show
  1. package/dist/cjs/codecs/h264.cjs +8 -3
  2. package/dist/cjs/codecs/h264.js.map +1 -1
  3. package/dist/cjs/codecs/hevc.cjs +3 -3
  4. package/dist/cjs/codecs/hevc.js.map +1 -1
  5. package/dist/cjs/codecs/mpeg4.cjs +1 -1
  6. package/dist/cjs/codecs/mpeg4.js.map +1 -1
  7. package/dist/cjs/codecs/mpegvideo.cjs +1 -1
  8. package/dist/cjs/codecs/mpegvideo.js.map +1 -1
  9. package/dist/cjs/codecs/vp8.cjs +1 -1
  10. package/dist/cjs/codecs/vp8.js.map +1 -1
  11. package/dist/cjs/codecs/vp9.cjs +1 -1
  12. package/dist/cjs/codecs/vp9.js.map +1 -1
  13. package/dist/cjs/codecs/vvc.cjs +3 -3
  14. package/dist/cjs/codecs/vvc.js.map +1 -1
  15. package/dist/cjs/function/audioData2AVFrame.cjs +7 -9
  16. package/dist/cjs/function/audioData2AVFrame.js.map +1 -1
  17. package/dist/cjs/function/avframe2VideoFrame.cjs +3 -2
  18. package/dist/cjs/function/avframe2VideoFrame.js.map +1 -1
  19. package/dist/cjs/function/videoFrame2AVFrame.cjs +12 -18
  20. package/dist/cjs/function/videoFrame2AVFrame.js.map +1 -1
  21. package/dist/esm/codecs/h264.d.ts +8 -1
  22. package/dist/esm/codecs/h264.js +8 -3
  23. package/dist/esm/codecs/h264.js.map +1 -1
  24. package/dist/esm/codecs/hevc.d.ts +8 -1
  25. package/dist/esm/codecs/hevc.js +3 -3
  26. package/dist/esm/codecs/hevc.js.map +1 -1
  27. package/dist/esm/codecs/mpeg4.d.ts +7 -1
  28. package/dist/esm/codecs/mpeg4.js +1 -1
  29. package/dist/esm/codecs/mpeg4.js.map +1 -1
  30. package/dist/esm/codecs/mpegvideo.d.ts +7 -1
  31. package/dist/esm/codecs/mpegvideo.js +1 -1
  32. package/dist/esm/codecs/mpegvideo.js.map +1 -1
  33. package/dist/esm/codecs/vp8.d.ts +7 -1
  34. package/dist/esm/codecs/vp8.js +1 -1
  35. package/dist/esm/codecs/vp8.js.map +1 -1
  36. package/dist/esm/codecs/vp9.d.ts +7 -1
  37. package/dist/esm/codecs/vp9.js +1 -1
  38. package/dist/esm/codecs/vp9.js.map +1 -1
  39. package/dist/esm/codecs/vvc.d.ts +8 -1
  40. package/dist/esm/codecs/vvc.js +3 -3
  41. package/dist/esm/codecs/vvc.js.map +1 -1
  42. package/dist/esm/function/audioData2AVFrame.d.ts +1 -1
  43. package/dist/esm/function/audioData2AVFrame.js +8 -11
  44. package/dist/esm/function/audioData2AVFrame.js.map +1 -1
  45. package/dist/esm/function/avframe2VideoFrame.d.ts +1 -1
  46. package/dist/esm/function/avframe2VideoFrame.js +3 -3
  47. package/dist/esm/function/avframe2VideoFrame.js.map +1 -1
  48. package/dist/esm/function/videoFrame2AVFrame.d.ts +1 -1
  49. package/dist/esm/function/videoFrame2AVFrame.js +12 -21
  50. package/dist/esm/function/videoFrame2AVFrame.js.map +1 -1
  51. package/package.json +3 -3
  52. package/src/codecs/h264.ts +17 -1
  53. package/src/codecs/hevc.ts +15 -3
  54. package/src/codecs/mpeg4.ts +7 -1
  55. package/src/codecs/mpegvideo.ts +7 -1
  56. package/src/codecs/vp8.ts +7 -1
  57. package/src/codecs/vp9.ts +7 -1
  58. package/src/codecs/vvc.ts +15 -3
  59. package/src/function/audioData2AVFrame.ts +3 -3
  60. package/src/function/avframe2VideoFrame.ts +6 -3
  61. 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), cheap__CTypeEnumWrite__1[15](avframe + 80, mapPixelFormat(videoFrame.format)),
33
- cheap__CTypeEnumWrite__1[17](avframe + 104, BigInt(Math.floor(videoFrame.timestamp))),
34
- cheap__CTypeEnumWrite__1[17](avframe + 232, cheap__CTypeEnumRead__0[17](avframe + 104)),
35
- cheap__CTypeEnumWrite__1[15](avframe + 68, videoFrame.codedWidth), cheap__CTypeEnumWrite__1[15](avframe + 72, videoFrame.codedHeight),
36
- cheap__CTypeEnumWrite__1[17](avframe + 312, BigInt(Math.floor(videoFrame.duration))),
37
- cheap__CTypeEnumWrite__1[15](avframe + 124, AV_TIME_BASE), cheap__CTypeEnumWrite__1[15](avframe + 120, 1),
38
- cheap__CTypeEnumWrite__1[15](avframe + 220, mapColorSpace(videoFrame.colorSpace.matrix)),
39
- cheap__CTypeEnumWrite__1[15](avframe + 212, mapColorPrimaries(videoFrame.colorSpace.primaries)),
40
- cheap__CTypeEnumWrite__1[15](avframe + 216, mapColorTrc(videoFrame.colorSpace.transfer)),
41
- cheap__CTypeEnumWrite__1[15](avframe + 208, videoFrame.colorSpace.fullRange ? 2 : 1),
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: cheap__CTypeEnumRead__0[20](avframe + 4 * i),
49
- stride: cheap__CTypeEnumRead__0[15](avframe + 32 + 4 * i)
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","cheap__CTypeEnumWrite__1","BigInt","Math","floor","timestamp","cheap__CTypeEnumRead__0","codedWidth","codedHeight","duration","matrix","primaries","transfer","fullRange","visibleRect","left","right","top","bottom","des","layout","i","comp","length","plane","push","offset","stride","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,mBAAmBC,YAAwBC,UAAA;IACpD,MAAPA,UACFA,UAAUrB,kBAGVE,aAAamB,UAGfC,yBAAA,IAAAD,UAAO,IAAUX,eAAeU,WAAWT;IAC3CW,yBAAA,IAAAD,UAAO,KAAAE,OAAAC,KAAAC,MAA0BL,WAAWM;IAC5CJ,yBAAA,IAAAD,UAAO,KAAAM,wBAAA,IAAuBN,UAAO;IACrCC,yBAAA,IAAAD,UAAO,IAASD,WAAWQ,aAC3BN,yBAAA,IAAAD,UAAO,IAAUD,WAAWS;IAC5BP,yBAAA,IAAAD,UAAO,KAAAE,OAAAC,KAAAC,MAA+BL,WAAWU;IACjDR,yBAAA,IAAAD,UAAO,KAAgBhB,eACvBiB,yBAAA,IAAAD,UAAO,KAAgB;IAEvBC,yBAAA,IAAAD,UAAO,KAAcT,cAAcQ,WAAWP,WAAWkB;IACzDT,yBAAA,IAAAD,UAAO,KAAkBP,kBAAkBM,WAAWP,WAAWmB;IACjEV,yBAAA,IAAAD,UAAO,KAAYL,YAAYI,WAAWP,WAAWoB;IACrDX,yBAAA,IAAAD,UAAO,KAAcD,WAAWP,WAAWqB,YAAW,IAAgC;IAElFd,WAAWe,gBACbb,yBAAA,IAAAD,UAAO,KAAmCD,WAAWe,YAAYC;IACjEd,yBAAA,IAAAD,UAAO,KAAoCD,WAAWQ,aAAaR,WAAWe,YAAYE;IAC1Ff,yBAAA,IAAAD,UAAO,KAAkCD,WAAWe,YAAYG,MAChEhB,yBAAA,IAAAD,UAAO,KAAqCD,WAAWS,cAAcT,WAAWe,YAAYI;IAG9FtC,eAAeoB;IAEf,MAAMmB,MAAMrC,2BAA2BwB,wBAAA,IAAAN,UAAO,MACxCoB,SAAwB;IAC9B,KAAK,IAAIC,IAAI,GAAGA,IAAIF,IAAIG,KAAKC,QAAQF,KAC/BF,IAAIG,KAAKD,GAAGG,SAASH,KACvBD,OAAOK,KAAK;QACVC,QAAMpB,wBAAA,IAA6CN,UAAO;QAC1D2B,QAAMrB,wBAAA,IAAEN,UAAO;;IAQrB,aAJMD,WAAW6B,OAAO7C,WAAW;QACjCqC;QAGKpB;AACT","ignoreList":[]}
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.2.0",
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.2.0",
22
- "@libmedia/cheap": "~1.2.0"
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",
@@ -662,12 +662,22 @@ export function parseAVCodecParameters(
662
662
  }
663
663
  }
664
664
 
665
- export function isIDR(avpacket: pointer<AVPacket>, naluLengthSize: int32 = 4) {
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
  }
@@ -702,12 +702,21 @@ export function parseAVCodecParameters(
702
702
  }
703
703
  }
704
704
 
705
- export function isIDR(avpacket: pointer<AVPacket>, naluLengthSize: int32 = 4) {
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 || type === HEVCNaluType.kSliceIDR_W_RADL
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 || type === HEVCNaluType.kSliceIDR_W_RADL) {
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) {
@@ -31,7 +31,13 @@ export const enum Mpeg4PictureType {
31
31
  B
32
32
  }
33
33
 
34
- export function isIDR(avpacket: pointer<AVPacket>) {
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
  }
@@ -32,7 +32,13 @@ export const enum MpegVideoPictureType {
32
32
  B
33
33
  }
34
34
 
35
- export function isIDR(avpacket: pointer<AVPacket>) {
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
- export function isIDR(avpacket: pointer<AVPacket>) {
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
- export function isIDR(avpacket: pointer<AVPacket>) {
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
- export function isIDR(avpacket: pointer<AVPacket>, naluLengthSize: int32 = 4) {
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 || type === VVCNaluType.kIDR_W_RADL
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 || type === VVCNaluType.kIDR_W_RADL) {
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: pointer<AVFrame> = nullptr) {
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, type AVPixelFormat } from '../pixfmt'
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: pointer<AVFrame> = nullptr) {
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
  }