fix transcode.Demuxer ReadPacket() bug
This commit is contained in:
parent
5f4a22fb98
commit
ca45b8cc97
@ -3,8 +3,11 @@ package transcode
|
|||||||
import (
|
import (
|
||||||
"github.com/nareix/av"
|
"github.com/nareix/av"
|
||||||
"github.com/nareix/av/pktreorder"
|
"github.com/nareix/av/pktreorder"
|
||||||
|
"fmt"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const debug = false
|
||||||
|
|
||||||
type tstream struct {
|
type tstream struct {
|
||||||
av.CodecData
|
av.CodecData
|
||||||
aenc av.AudioEncoder
|
aenc av.AudioEncoder
|
||||||
@ -18,6 +21,8 @@ type Transcoder struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (self *Transcoder) Setup(streams []av.CodecData) (err error) {
|
func (self *Transcoder) Setup(streams []av.CodecData) (err error) {
|
||||||
|
self.streams = []*tstream{}
|
||||||
|
|
||||||
for _, stream := range streams {
|
for _, stream := range streams {
|
||||||
ts := &tstream{CodecData: stream}
|
ts := &tstream{CodecData: stream}
|
||||||
if stream.IsAudio() {
|
if stream.IsAudio() {
|
||||||
@ -44,27 +49,42 @@ func (self *Transcoder) Setup(streams []av.CodecData) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *Transcoder) WritePacket(i int, pkt av.Packet) (err error) {
|
func (self *Transcoder) decodeAndEncode(stream *tstream, i int, pkt av.Packet) (err error) {
|
||||||
stream := self.streams[i]
|
var frame av.AudioFrame
|
||||||
if stream.aenc != nil && stream.adec != nil {
|
var ok bool
|
||||||
var frame av.AudioFrame
|
if ok, frame, err = stream.adec.Decode(pkt.Data); err != nil {
|
||||||
var ok bool
|
return
|
||||||
if ok, frame, err = stream.adec.Decode(pkt.Data); err != nil {
|
}
|
||||||
|
if ok {
|
||||||
|
var pkts []av.Packet
|
||||||
|
if pkts, err = stream.aenc.Encode(frame); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if ok {
|
for _, pkt := range pkts {
|
||||||
var pkts []av.Packet
|
self.queue.WritePacket(i, pkt)
|
||||||
if pkts, err = stream.aenc.Encode(frame); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for _, pkt := range pkts {
|
|
||||||
self.queue.WritePacket(i, pkt)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (self *Transcoder) WritePacket(i int, pkt av.Packet) {
|
||||||
|
if debug {
|
||||||
|
fmt.Println("transcode: Transcoder.WritePacket", i, len(pkt.Data), fmt.Sprintf("%.2f", pkt.Duration))
|
||||||
|
fmt.Println("transcode: Transcoder.CanReadPacket", self.CanReadPacket())
|
||||||
|
}
|
||||||
|
|
||||||
|
stream := self.streams[i]
|
||||||
|
if stream.aenc != nil && stream.adec != nil {
|
||||||
|
if err := self.decodeAndEncode(stream, i, pkt); err != nil {
|
||||||
|
self.queue.EndWritePacket(err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
self.queue.WritePacket(i, pkt)
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func (self *Transcoder) EndWritePacket(err error) {
|
func (self *Transcoder) EndWritePacket(err error) {
|
||||||
self.queue.EndWritePacket(err)
|
self.queue.EndWritePacket(err)
|
||||||
}
|
}
|
||||||
@ -73,6 +93,14 @@ func (self *Transcoder) CanReadPacket() bool {
|
|||||||
return self.queue.CanReadPacket()
|
return self.queue.CanReadPacket()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (self *Transcoder) CanWritePacket() bool {
|
||||||
|
return self.queue.CanWritePacket()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (self *Transcoder) Error() error {
|
||||||
|
return self.queue.Error()
|
||||||
|
}
|
||||||
|
|
||||||
func (self *Transcoder) ReadPacket() (i int, pkt av.Packet, err error) {
|
func (self *Transcoder) ReadPacket() (i int, pkt av.Packet, err error) {
|
||||||
return self.queue.ReadPacket()
|
return self.queue.ReadPacket()
|
||||||
}
|
}
|
||||||
@ -160,12 +188,15 @@ func (self *Demuxer) ReadPacket() (i int, pkt av.Packet, err error) {
|
|||||||
for {
|
for {
|
||||||
if self.Transcoder.CanReadPacket() {
|
if self.Transcoder.CanReadPacket() {
|
||||||
return self.Transcoder.ReadPacket()
|
return self.Transcoder.ReadPacket()
|
||||||
} else {
|
} else if self.Transcoder.CanWritePacket() {
|
||||||
if i, pkt, err := self.Demuxer.ReadPacket(); err != nil {
|
if i, pkt, err := self.Demuxer.ReadPacket(); err != nil {
|
||||||
self.Transcoder.EndWritePacket(err)
|
self.Transcoder.EndWritePacket(err)
|
||||||
} else {
|
} else {
|
||||||
self.Transcoder.WritePacket(i, pkt)
|
self.Transcoder.WritePacket(i, pkt)
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
err = self.Transcoder.Error()
|
||||||
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user