func (m *Muxer) AddVideoStream(codecId uint32, width, height int) bool { codec := C.avcodec_find_encoder(codecId) if codec == (*C.AVCodec)(null) { return false } m.context.oformat.video_codec = codecId stream := C.avformat_new_stream(m.context, codec) if stream == (*C.AVStream)(null) { return false } m.videoStream = Stream{stream, 0} c := m.videoStream.stream.codec c.codec_id = codecId c.codec_type = C.AVMEDIA_TYPE_VIDEO c.bit_rate = 400000 c.width = C.int(width) c.height = C.int(height) m.videoStream.stream.time_base = C.AVRational{1, 30} c.time_base = m.videoStream.stream.time_base c.gop_size = 12 c.pix_fmt = C.AV_PIX_FMT_YUV420P if m.context.oformat.flags&C.AVFMT_GLOBALHEADER != 0 { c.flags |= C.CODEC_FLAG_GLOBAL_HEADER } if C.avcodec_open2(c, (*C.AVCodec)(null), (**C.AVDictionary)(null)) < 0 { return false } m.recl = append(m.recl, func() { C.avcodec_close(c) }) return true }
func avcodec_close(cctx _CodecContext) { if cctx.ctx != nil { avcodec_mutex.Lock() C.avcodec_close(cctx.ctx) avcodec_mutex.Unlock() } }
func (e *Encoder) Close() { // Process "delayed" frames for { outsize := C.avcodec_encode_video(e._context, ptr(e._outbuf), C.int(len(e._outbuf)), nil) if outsize == 0 { break } n, err := e.Output.Write(e._outbuf[:outsize]) if err != nil { panic(err) } if n < int(outsize) { panic(fmt.Errorf("Short write, expected %d, wrote %d", outsize, n)) } } n, err := e.Output.Write([]byte{0, 0, 1, 0xb7}) if err != nil || n != 4 { log.Panicf("Error finishing mpeg file: %q; n = %d", err, n) } C.avcodec_close((*C.AVCodecContext)(unsafe.Pointer(e._context))) C.av_free(unsafe.Pointer(e._context)) C.av_free(unsafe.Pointer(e._frame)) e._frame, e._codec = nil, nil }
func (self *Decoder) Close() { C.avformat_close_input(&self.FormatContext) for _, stream := range self.Streams { C.avcodec_close(stream.codec) } for _, frame := range self.frames { C.av_frame_free(&frame) } for _, buffer := range self.buffers { C.av_free(unsafe.Pointer(buffer)) } close(self.frameChan) self.running = false }
func (m *Muxer) AddAudioStream(codecId uint32) bool { codec := C.avcodec_find_encoder(codecId) if codec == (*C.AVCodec)(null) { return false } m.context.oformat.audio_codec = codecId stream := C.avformat_new_stream(m.context, codec) if stream == (*C.AVStream)(null) { return false } m.audioStream = Stream{stream, 0} c := m.audioStream.stream.codec c.bit_rate = 48000 c.sample_fmt = C.AV_SAMPLE_FMT_S16 if C.check_sample_fmt(codec, c.sample_fmt) == 0 { return false } c.channels = 1 c.channel_layout = C.uint64_t(C.av_get_default_channel_layout(c.channels)) c.sample_rate = 44100 m.audioStream.stream.time_base = C.AVRational{1, c.sample_rate} c.time_base = m.audioStream.stream.time_base if m.context.oformat.flags&C.AVFMT_GLOBALHEADER != 0 { c.flags |= C.CODEC_FLAG_GLOBAL_HEADER } if codecId == C.AV_CODEC_ID_AAC { m.fifo = C.av_audio_fifo_alloc(c.sample_fmt, c.channels, 1) if m.fifo == (*C.AVAudioFifo)(null) { return false } m.recl = append(m.recl, func() { C.av_audio_fifo_free(m.fifo) }) } if C.avcodec_open2(c, (*C.AVCodec)(null), (**C.AVDictionary)(null)) < 0 { return false } m.recl = append(m.recl, func() { C.avcodec_close(c) }) if c.codec.capabilities&C.CODEC_CAP_VARIABLE_FRAME_SIZE != 0 { c.frame_size = 10000 } return true }
//Close a given Context and free all the data associated with it (but not the Context itself). func (ctxt *Context) AvcodecClose() int { return int(C.avcodec_close((*C.struct_AVCodecContext)(ctxt))) }
func (this *CodecCtx) Close() { if nil != this.avCodecCtx { C.avcodec_close(this.avCodecCtx) this.avCodecCtx = nil } }
func (this *CodecCtx) Release() { C.avcodec_close(this.avCodecCtx) C.av_freep(unsafe.Pointer(&this.avCodecCtx)) }
func (this *CodecCtx) Close() { C.avcodec_close(this.avCodecCtx) }
func (id *Capture) Close() { C.av_frame_free(&(id.frame)) C.avcodec_close(id.codec) C.avformat_close_input(&(id.context)) C.sws_freeContext(id.sws) }
func (stream *Stream) freeCodecContext() { if stream.cdcctx != nil { C.avcodec_close(stream.cdcctx) stream.cdcctx = nil } }