Skip to content

Commit

Permalink
add SetExtraData to CodecParameters to set extradata (#56)
Browse files Browse the repository at this point in the history
* add SetExtraData

* add simple test case

* review changes

* correct testcase for SetExtraData
  • Loading branch information
Cacsjep authored Mar 29, 2024
1 parent deecc33 commit f60ac38
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 0 deletions.
35 changes: 35 additions & 0 deletions codec_parameters.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@ package astiav
//#cgo pkg-config: libavcodec
//#include <libavcodec/avcodec.h>
import "C"
import (
"fmt"
"unsafe"
)

// https://github.com/FFmpeg/FFmpeg/blob/n5.0/libavcodec/codec_par.h#L52
type CodecParameters struct {
Expand Down Expand Up @@ -141,6 +145,37 @@ func (cp *CodecParameters) SetSampleAspectRatio(r Rational) {
cp.c.sample_aspect_ratio = r.c
}

func (cp *CodecParameters) ExtraData() []byte {
return bytesFromC(func(size *C.size_t) *C.uint8_t {
if cp.c.extradata == nil {
*size = C.size_t(0)
return nil
}
*size = C.size_t(cp.c.extradata_size)
return cp.c.extradata
})
}

func (cp *CodecParameters) SetExtraData(extraData []byte) error {
if len(extraData) == 0 {
return nil
}

if cp.c.extradata != nil {
C.av_freep(unsafe.Pointer(&cp.c.extradata))
cp.c.extradata_size = 0
}

extradataSize := len(extraData)
if cp.c.extradata = (*C.uint8_t)(C.av_mallocz(C.size_t(extradataSize + C.AV_INPUT_BUFFER_PADDING_SIZE))); cp.c.extradata == nil {
return fmt.Errorf("astiav: allocation is nil")
}

C.memcpy(unsafe.Pointer(cp.c.extradata), unsafe.Pointer(&extraData[0]), C.size_t(extradataSize))
cp.c.extradata_size = C.int(extradataSize)
return nil
}

func (cp *CodecParameters) SampleFormat() SampleFormat {
return SampleFormat(cp.c.format)
}
Expand Down
4 changes: 4 additions & 0 deletions codec_parameters_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,4 +95,8 @@ func TestCodecParameters(t *testing.T) {
require.Equal(t, 4, cp6.SampleRate())
cp6.SetWidth(2)
require.Equal(t, 2, cp6.Width())

extraBytes := []byte{0, 0, 0, 1}
require.NoError(t, cp6.SetExtraData(extraBytes))
require.Equal(t, extraBytes, cp6.ExtraData())
}

0 comments on commit f60ac38

Please sign in to comment.