Ejemplo n.º 1
0
func (c *Decoder) decodeAudio(p Packet) *Frame {
	packet := new(C.AVPacket)
	C.av_init_packet(packet)
	defer C.av_free_packet(packet)

	packet.pts = C.int64_t(p.Pts)
	packet.dts = C.int64_t(p.Dts)
	packet.size = C.int(p.Size)
	packet.data = (*C.uint8_t)(unsafe.Pointer(&p.Data[0]))
	packet.stream_index = C.int(p.Stream)
	packet.flags = C.int(p.Flags)
	packet.duration = C.int(p.Duration)
	packet.pos = C.int64_t(p.Pos)
	//size:=packet.size;
	samples_size := C.int(C.AVCODEC_MAX_AUDIO_FRAME_SIZE)
	//bps := C.av_get_bits_per_sample_fmt(c.Ctx.sample_fmt) >> 3;

	outbuf := (*C.uint8_t)(C.av_malloc(C.uint(samples_size)))
	defer C.av_free(unsafe.Pointer(outbuf))
	C.avcodec_decode_audio3(c.Ctx, (*C.int16_t)(unsafe.Pointer(outbuf)), &samples_size, packet)
	//println(data_len)
	return nil
}
Ejemplo n.º 2
0
func (c *Decoder) decodeVideo(p Packet) *Frame {
	if !c.Valid {
		//println("try to decode with an invalid Decoder")
		return nil
	}
	//println("try to decode with a valid Decoder")

	packet := new(C.AVPacket)
	C.av_init_packet(packet)
	defer C.av_free_packet(packet)

	packet.pts = C.int64_t(p.Pts)
	packet.dts = C.int64_t(p.Dts)
	packet.size = C.int(p.Size)
	//packet.data=&C.uint8_t(make([]byte, p.Size)[0])
	//myBytes:=make([]byte,p.Size);
	/*
	   var pb *byte
	   if(len(p.Data)>0){
	   //println("Data > 0")
	   pb=&p.Data[0]
	   }*/
	packet.data = (*C.uint8_t)(unsafe.Pointer(&p.Data[0]))
	//    println(p.Data)
	//    println(pb)
	//    println(packet.data)
	//    packet.data=unsafe.Pointer(p.Data)
	//    for i:= 0; i < re.Size; i++ {
	//      re.Data[i] = data[i];
	//    }
	packet.stream_index = C.int(p.Stream)
	packet.flags = C.int(p.Flags)
	packet.duration = C.int(p.Duration)
	packet.pos = C.int64_t(p.Pos)

	height := c.Ctx.height
	width := c.Ctx.width
	var frame *Frame = new(Frame)

	numBytes := C.avpicture_get_size(0, width, height)
	//_size = numBytes;
	//_buffer := (*C.uint8_t) (C.av_malloc(C.uint(numBytes)));
	if numBytes > 0 {
		var buffer []byte = make([]byte, numBytes)
		var pbuffer *byte = &buffer[0]
		// C.memset((*C.uint8_t)(_buffer), 0, C.size_t(numBytes));
		// Assign appropriate parts of buffer to image planes
		//var picture * C.AVPicture=(*C.AVPicture)(unsafe.Pointer(frame))
		//println(frame)
		//println(picture)
		//:=&frame
		//854x480
		C.avpicture_fill((*C.AVPicture)(unsafe.Pointer(frame)), (*C.uint8_t)(unsafe.Pointer(pbuffer)), 0, width, height)
	}

	//frameFinished:=C.int(0)
	var frameFinished *C.int = new(C.int)
	//bytes_decoded:=

	C.avcodec_decode_video2(c.Ctx, (*C.AVFrame)(unsafe.Pointer(frame)), frameFinished, packet)
	frame.pts = packet.pts
	//frame.dts=packet.dts

	/*
	   //C.avcodec_decode_video2(nil,nil,nil,nil)

	   header:=fmt.Sprintf("P5\n%d %d\n255\n",width,height)

	   file, err := os.Open("test.ppm", os.O_CREATE|os.O_TRUNC|os.O_RDWR, 0666)

	   if(err!=nil){
	   println("error while openning file")
	   }
	   file.WriteString(header)
	   linesize:=int(frame.linesize[0])
	   //println(linesize)
	   data:=make([]byte, width)
	   tmpdata:=(*(*[1<<30]byte)(unsafe.Pointer(frame.data[0])))[0:numBytes]
	   //    for i:= 0; i < 1; i++ {
	   //      data[i] = tmpdata[i];
	   //    }

	   for i := 0; i < int(height); i++{
	   for a:= 0; a < int(width); a++ {
	   data[a] = tmpdata[(i*linesize)+a];
	   }
	   file.Write(data);
	   }

	   file.Close()*/
	//ioutil.WriteFile("test.data", header,0755)
	//println("bla fasel")
	//println(bytes_decoded)
	//println(*frameFinished)
	return frame
}