-
Notifications
You must be signed in to change notification settings - Fork 59
/
Copy pathframe_side_data.go
79 lines (68 loc) · 2.39 KB
/
frame_side_data.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package astiav
//#include <libavutil/frame.h>
//#include "frame_side_data.h"
import "C"
import (
"errors"
"math"
"unsafe"
)
// https://ffmpeg.org/doxygen/7.0/structAVFrameSideData.html
// https://ffmpeg.org/doxygen/7.0/group__lavu__frame.html#gae01fa7e427274293aacdf2adc17076bc
type FrameSideData struct {
sd ***C.AVFrameSideData
size *C.int
}
func newFrameSideDataFromC(sd ***C.AVFrameSideData, size *C.int) *FrameSideData {
return &FrameSideData{
sd: sd,
size: size,
}
}
// https://ffmpeg.org/doxygen/7.0/group__lavu__frame.html#ggae01fa7e427274293aacdf2adc17076bcaf525ec92d2c5a78d44950bc3f29972aa
func (d *FrameSideData) RegionsOfInterest() *frameSideDataRegionsOfInterest {
return newFrameSideDataRegionsOfInterest(d)
}
type frameSideDataRegionsOfInterest struct {
d *FrameSideData
}
func newFrameSideDataRegionsOfInterest(d *FrameSideData) *frameSideDataRegionsOfInterest {
return &frameSideDataRegionsOfInterest{d: d}
}
func (d *frameSideDataRegionsOfInterest) data(sd *C.AVFrameSideData) *[(math.MaxInt32 - 1) / C.sizeof_AVRegionOfInterest]C.AVRegionOfInterest {
return (*[(math.MaxInt32 - 1) / C.sizeof_AVRegionOfInterest](C.AVRegionOfInterest))(unsafe.Pointer(C.astiavConvertRegionsOfInterestFrameSideData(sd)))
}
func (d *frameSideDataRegionsOfInterest) Add(rois []RegionOfInterest) error {
sd := C.av_frame_side_data_new(d.d.sd, d.d.size, C.AV_FRAME_DATA_REGIONS_OF_INTEREST, C.size_t(C.sizeof_AVRegionOfInterest*len(rois)), 0)
if sd == nil {
return errors.New("astiav: nil pointer")
}
crois := d.data(sd)
for i, roi := range rois {
crois[i].bottom = C.int(roi.Bottom)
crois[i].left = C.int(roi.Left)
crois[i].qoffset = roi.QuantisationOffset.c
crois[i].right = C.int(roi.Right)
crois[i].self_size = C.sizeof_AVRegionOfInterest
crois[i].top = C.int(roi.Top)
}
return nil
}
func (d *frameSideDataRegionsOfInterest) Get() ([]RegionOfInterest, bool) {
sd := C.av_frame_side_data_get(*d.d.sd, *d.d.size, C.AV_FRAME_DATA_REGIONS_OF_INTEREST)
if sd == nil {
return nil, false
}
crois := d.data(sd)
rois := make([]RegionOfInterest, int(sd.size/C.sizeof_AVRegionOfInterest))
for i := range rois {
rois[i] = RegionOfInterest{
Bottom: int(crois[i].bottom),
Left: int(crois[i].left),
QuantisationOffset: newRationalFromC(crois[i].qoffset),
Right: int(crois[i].right),
Top: int(crois[i].top),
}
}
return rois, true
}