(slice []byte)
| 29 | } |
| 30 | |
| 31 | func (vt *H265) WriteSliceBytes(slice []byte) { |
| 32 | if len(slice) == 0 { |
| 33 | vt.Error("H265 WriteSliceBytes got empty slice") |
| 34 | return |
| 35 | } |
| 36 | t := codec.ParseH265NALUType(slice[0]) |
| 37 | if log.Trace { |
| 38 | vt.Trace("naluType", zap.Uint8("naluType", byte(t))) |
| 39 | } |
| 40 | switch t { |
| 41 | case codec.NAL_UNIT_VPS: |
| 42 | vt.VPS = slice |
| 43 | vt.ParamaterSets[0] = slice |
| 44 | case codec.NAL_UNIT_SPS: |
| 45 | vt.SPS = slice |
| 46 | vt.ParamaterSets[1] = slice |
| 47 | spsInfo, _ := codec.ParseHevcSPS(slice) |
| 48 | if spsInfo.Width != vt.SPSInfo.Width || spsInfo.Height != vt.SPSInfo.Height { |
| 49 | vt.Debug("SPS", zap.Any("SPSInfo", spsInfo)) |
| 50 | } |
| 51 | vt.SPSInfo = spsInfo |
| 52 | case codec.NAL_UNIT_PPS: |
| 53 | vt.PPS = slice |
| 54 | vt.ParamaterSets[2] = slice |
| 55 | if vt.VPS != nil && vt.SPS != nil && vt.PPS != nil { |
| 56 | extraData, err := codec.BuildH265SeqHeaderFromVpsSpsPps(vt.VPS, vt.SPS, vt.PPS) |
| 57 | if err == nil { |
| 58 | vt.nalulenSize = (int(extraData[26]) & 0x03) + 1 |
| 59 | vt.Video.WriteSequenceHead(extraData) |
| 60 | } else { |
| 61 | vt.Error("H265 BuildH265SeqHeaderFromVpsSpsPps", zap.Error(err)) |
| 62 | // vt.Stream.Close() |
| 63 | } |
| 64 | } |
| 65 | case |
| 66 | codec.NAL_UNIT_CODED_SLICE_BLA, |
| 67 | codec.NAL_UNIT_CODED_SLICE_BLANT, |
| 68 | codec.NAL_UNIT_CODED_SLICE_BLA_N_LP, |
| 69 | codec.NAL_UNIT_CODED_SLICE_IDR, |
| 70 | codec.NAL_UNIT_CODED_SLICE_IDR_N_LP, |
| 71 | codec.NAL_UNIT_CODED_SLICE_CRA: |
| 72 | vt.Value.IFrame = true |
| 73 | vt.AppendAuBytes(slice) |
| 74 | case 0, 1, 2, 3, 4, 5, 6, 7, 8, 9: |
| 75 | vt.Value.IFrame = false |
| 76 | vt.AppendAuBytes(slice) |
| 77 | case codec.NAL_UNIT_SEI, codec.NAL_UNIT_SEI_SUFFIX: |
| 78 | vt.AppendAuBytes(slice) |
| 79 | case codec.NAL_UNIT_ACCESS_UNIT_DELIMITER: |
| 80 | default: |
| 81 | vt.Warn("nalu type not supported", zap.Uint("type", uint(t))) |
| 82 | } |
| 83 | } |
| 84 | |
| 85 | func (vt *H265) WriteSequenceHead(head []byte) (err error) { |
| 86 | if vt.VPS, vt.SPS, vt.PPS, err = codec.ParseVpsSpsPpsFromSeqHeaderWithoutMalloc(head); err == nil { |
no test coverage detected