diff --git a/cgo/ffmpeg/audio.go b/cgo/ffmpeg/audio.go index 2307408..7a70d20 100644 --- a/cgo/ffmpeg/audio.go +++ b/cgo/ffmpeg/audio.go @@ -78,12 +78,34 @@ func (self *Resampler) Resample(in av.AudioFrame) (out av.AudioFrame, err error) self.inSampleRate = in.SampleRate self.inChannelLayout = in.ChannelLayout avr := C.swr_alloc() - C.av_opt_set_int(unsafe.Pointer(avr), C.CString("in_channel_layout"), C.int64_t(channelLayoutAV2FF(self.inChannelLayout)), 0) - C.av_opt_set_int(unsafe.Pointer(avr), C.CString("out_channel_layout"), C.int64_t(channelLayoutAV2FF(self.OutChannelLayout)), 0) - C.av_opt_set_int(unsafe.Pointer(avr), C.CString("in_sample_rate"), C.int64_t(self.inSampleRate), 0) - C.av_opt_set_int(unsafe.Pointer(avr), C.CString("out_sample_rate"), C.int64_t(self.OutSampleRate), 0) - C.av_opt_set_int(unsafe.Pointer(avr), C.CString("in_sample_fmt"), C.int64_t(sampleFormatAV2FF(self.inSampleFormat)), 0) - C.av_opt_set_int(unsafe.Pointer(avr), C.CString("out_sample_fmt"), C.int64_t(sampleFormatAV2FF(self.OutSampleFormat)), 0) + + cs1 := C.CString("in_channel_layout") + cs2 := C.CString("out_channel_layout") + cs3 := C.CString("in_sample_rate") + cs4 := C.CString("out_sample_rate") + cs5 := C.CString("in_sample_fmt") + cs6 := C.CString("out_sample_fmt") + defer C.free(unsafe.Pointer(cs1)) + defer C.free(unsafe.Pointer(cs2)) + defer C.free(unsafe.Pointer(cs3)) + defer C.free(unsafe.Pointer(cs4)) + defer C.free(unsafe.Pointer(cs5)) + defer C.free(unsafe.Pointer(cs6)) + + C.av_opt_set_int(unsafe.Pointer(avr), cs1, C.int64_t(channelLayoutAV2FF(self.inChannelLayout)), 0) + C.av_opt_set_int(unsafe.Pointer(avr), cs2, C.int64_t(channelLayoutAV2FF(self.OutChannelLayout)), 0) + C.av_opt_set_int(unsafe.Pointer(avr), cs3, C.int64_t(self.inSampleRate), 0) + C.av_opt_set_int(unsafe.Pointer(avr), cs4, C.int64_t(self.OutSampleRate), 0) + C.av_opt_set_int(unsafe.Pointer(avr), cs5, C.int64_t(sampleFormatAV2FF(self.inSampleFormat)), 0) + C.av_opt_set_int(unsafe.Pointer(avr), cs6, C.int64_t(sampleFormatAV2FF(self.OutSampleFormat)), 0) + /* + C.av_opt_set_int(unsafe.Pointer(avr), C.CString("in_channel_layout"), C.int64_t(channelLayoutAV2FF(self.inChannelLayout)), 0) + C.av_opt_set_int(unsafe.Pointer(avr), C.CString("out_channel_layout"), C.int64_t(channelLayoutAV2FF(self.OutChannelLayout)), 0) + C.av_opt_set_int(unsafe.Pointer(avr), C.CString("in_sample_rate"), C.int64_t(self.inSampleRate), 0) + C.av_opt_set_int(unsafe.Pointer(avr), C.CString("out_sample_rate"), C.int64_t(self.OutSampleRate), 0) + C.av_opt_set_int(unsafe.Pointer(avr), C.CString("in_sample_fmt"), C.int64_t(sampleFormatAV2FF(self.inSampleFormat)), 0) + C.av_opt_set_int(unsafe.Pointer(avr), C.CString("out_sample_fmt"), C.int64_t(sampleFormatAV2FF(self.OutSampleFormat)), 0) + */ C.swr_init(avr) self.avr = avr } @@ -238,7 +260,10 @@ func (self *AudioEncoder) SetOption(key string, val interface{}) (err error) { sval := fmt.Sprint(val) if key == "profile" { - ff.profile = C.avcodec_profile_name_to_int(ff.codec, C.CString(sval)) + cs1 := C.CString(sval) + defer C.free(unsafe.Pointer(cs1)) + ff.profile = C.avcodec_profile_name_to_int(ff.codec, cs1) + //ff.profile = C.avcodec_profile_name_to_int(ff.codec, C.CString(sval)) if ff.profile == C.FF_PROFILE_UNKNOWN { err = fmt.Errorf("ffmpeg: profile `%s` invalid", sval) return @@ -246,13 +271,19 @@ func (self *AudioEncoder) SetOption(key string, val interface{}) (err error) { return } - C.av_dict_set(&ff.options, C.CString(key), C.CString(sval), 0) + cs2 := C.CString(sval) + defer C.free(unsafe.Pointer(cs2)) + C.av_dict_set(&ff.options, C.CString(key), cs2, 0) + //C.av_dict_set(&ff.options, C.CString(key), C.CString(sval), 0) return } func (self *AudioEncoder) GetOption(key string, val interface{}) (err error) { ff := &self.ff.ff - entry := C.av_dict_get(ff.options, C.CString(key), nil, 0) + cs1 := C.CString(key) + defer C.free(unsafe.Pointer(cs1)) + entry := C.av_dict_get(ff.options, cs1, nil, 0) + //entry := C.av_dict_get(ff.options, C.CString(key), nil, 0) if entry == nil { err = fmt.Errorf("ffmpeg: GetOption failed: `%s` not exists", key) return @@ -650,7 +681,10 @@ func NewAudioEncoderByCodecType(typ av.CodecType) (enc *AudioEncoder, err error) func NewAudioEncoderByName(name string) (enc *AudioEncoder, err error) { _enc := &AudioEncoder{} - codec := C.avcodec_find_encoder_by_name(C.CString(name)) + cs1 := C.CString(name) + defer C.free(unsafe.Pointer(cs1)) + codec := C.avcodec_find_encoder_by_name(cs1) + //codec := C.avcodec_find_encoder_by_name(C.CString(name)) if codec == nil || C.avcodec_get_type(codec.id) != C.AVMEDIA_TYPE_AUDIO { err = fmt.Errorf("ffmpeg: cannot find audio encoder name=%s", name) return diff --git a/cgo/ffmpeg/ffmpeg.go b/cgo/ffmpeg/ffmpeg.go index 142cc5a..3deca07 100644 --- a/cgo/ffmpeg/ffmpeg.go +++ b/cgo/ffmpeg/ffmpeg.go @@ -1,7 +1,7 @@ package ffmpeg /* -#cgo LDFLAGS: /usr/local/lib/libavcodec.a /usr/local/lib/libavformat.a /usr/local/lib/libavutil.a /usr/local/lib/libswscale.a /usr/local/lib/libswresample.a -lm -lz -llzma +#cgo LDFLAGS: /usr/local/lib/libavcodec.a /usr/local/lib/libavformat.a /usr/local/lib/libavutil.a /usr/local/lib/libswscale.a /usr/local/lib/libswresample.a -lm -lz -llzma #include "ffmpeg.h" void ffinit() { #if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(58, 9, 100) @@ -28,11 +28,17 @@ const ( ) func HasEncoder(name string) bool { - return C.avcodec_find_encoder_by_name(C.CString(name)) != nil + cs1 := C.CString(name) + defer C.free(unsafe.Pointer(cs1)) + return C.avcodec_find_encoder_by_name(cs1) != nil + //return C.avcodec_find_encoder_by_name(C.CString(name)) != nil } func HasDecoder(name string) bool { - return C.avcodec_find_decoder_by_name(C.CString(name)) != nil + cs1 := C.CString(name) + defer C.free(unsafe.Pointer(cs1)) + return C.avcodec_find_decoder_by_name(cs1) != nil + //return C.avcodec_find_decoder_by_name(C.CString(name)) != nil } //func EncodersList() []string diff --git a/cgo/ffmpeg/video.go b/cgo/ffmpeg/video.go index 3f281a7..1ed9dc8 100644 --- a/cgo/ffmpeg/video.go +++ b/cgo/ffmpeg/video.go @@ -183,7 +183,10 @@ func NewVideoDecoder(stream av.CodecData) (dec *VideoDecoder, err error) { return } - c := C.avcodec_find_decoder_by_name(C.CString("h264_cuvid")) + cs1 := C.CString("h264_cuvid") + defer C.free(unsafe.Pointer(cs1)) + c := C.avcodec_find_decoder_by_name(cs1) + //c := C.avcodec_find_decoder_by_name(C.CString("h264_cuvid")) if c == nil || C.avcodec_get_type(id) != C.AVMEDIA_TYPE_VIDEO { c = C.avcodec_find_decoder(id) if c == nil || C.avcodec_get_type(id) != C.AVMEDIA_TYPE_VIDEO {