bugfix avutil

This commit is contained in:
nareix 2016-06-30 20:31:15 +08:00
parent 3961941cc1
commit 20aee0b19c

View File

@ -19,6 +19,10 @@ func (self handlerDemuxer) Close() error {
return self.r.Close() return self.r.Close()
} }
func (self handlerDemuxer) ReadHeader() error {
return self.Demuxer.(headerReader).ReadHeader()
}
type handlerMuxer struct { type handlerMuxer struct {
av.Muxer av.Muxer
w io.WriteCloser w io.WriteCloser
@ -32,7 +36,7 @@ type RegisterHandler struct {
Ext string Ext string
ReaderDemuxer func(io.Reader)av.Demuxer ReaderDemuxer func(io.Reader)av.Demuxer
WriterMuxer func(io.Writer)av.Muxer WriterMuxer func(io.Writer)av.Muxer
UrlDemuxer func(string)(bool,av.DemuxerCloser,error) UrlDemuxer func(string)(bool,av.DemuxCloser,error)
UrlReader func(string)(bool,io.ReadCloser,error) UrlReader func(string)(bool,io.ReadCloser,error)
Probe func([]byte)bool Probe func([]byte)bool
} }
@ -48,19 +52,19 @@ func (self *Handlers) Add(fn func(*RegisterHandler)) {
} }
func (self *Handlers) openUrl(u *url.URL, uri string) (r io.ReadCloser, err error) { func (self *Handlers) openUrl(u *url.URL, uri string) (r io.ReadCloser, err error) {
if u == nil { if u != nil && u.Scheme != "" {
r, err = os.Open(uri) for _, handler := range self.handlers {
return if handler.UrlReader != nil {
} var ok bool
for _, handler := range self.handlers { if ok, r, err = handler.UrlReader(uri); ok {
if handler.UrlReader != nil { return
var ok bool }
if ok, r, err = handler.UrlReader(uri); ok {
return
} }
} }
err = fmt.Errorf("avutil: openUrl %s failed", uri)
} else {
r, err = os.Open(uri)
} }
err = fmt.Errorf("avutil: openUrl %s failed", uri)
return return
} }
@ -69,7 +73,22 @@ func (self *Handlers) createUrl(u *url.URL, uri string) (w io.WriteCloser, err e
return return
} }
func (self *Handlers) Open(uri string) (demuxer av.DemuxerCloser, err error) { type headerReader interface {
ReadHeader() error
}
func (self *Handlers) Open(uri string) (demuxer av.DemuxCloser, err error) {
if demuxer, err = self.OpenDemuxer(uri); err != nil {
return
}
hr := demuxer.(headerReader)
if err = hr.ReadHeader(); err != nil {
return
}
return
}
func (self *Handlers) OpenDemuxer(uri string) (demuxer av.DemuxCloser, err error) {
for _, handler := range self.handlers { for _, handler := range self.handlers {
if handler.UrlDemuxer != nil { if handler.UrlDemuxer != nil {
var ok bool var ok bool
@ -82,17 +101,17 @@ func (self *Handlers) Open(uri string) (demuxer av.DemuxerCloser, err error) {
var r io.ReadCloser var r io.ReadCloser
var ext string var ext string
var u *url.URL var u *url.URL
var uerr error if u, _ = url.Parse(uri); u != nil && u.Scheme != "" {
if u, uerr = url.Parse(uri); uerr != nil {
ext = path.Ext(uri)
} else {
ext = path.Ext(u.Path) ext = path.Ext(u.Path)
} else {
ext = path.Ext(uri)
} }
if ext != "" { if ext != "" {
for _, handler := range self.handlers { for _, handler := range self.handlers {
if handler.Ext == ext { if handler.Ext == ext {
if handler.ReaderDemuxer != nil { if handler.ReaderDemuxer != nil {
fmt.Println("openext", ext, handler.ReaderDemuxer)
if r, err = self.openUrl(u, uri); err != nil { if r, err = self.openUrl(u, uri); err != nil {
return return
} }
@ -128,14 +147,13 @@ func (self *Handlers) Open(uri string) (demuxer av.DemuxerCloser, err error) {
return return
} }
func (self *Handlers) Create(uri string) (muxer av.MuxerCloser, err error) { func (self *Handlers) Create(uri string, streams []av.CodecData) (muxer av.MuxCloser, err error) {
var ext string var ext string
var u *url.URL var u *url.URL
var uerr error if u, _ = url.Parse(uri); u != nil && u.Scheme != "" {
if u, uerr = url.Parse(uri); uerr != nil {
ext = path.Ext(uri)
} else {
ext = path.Ext(u.Path) ext = path.Ext(u.Path)
} else {
ext = path.Ext(uri)
} }
if ext != "" { if ext != "" {
@ -149,6 +167,9 @@ func (self *Handlers) Create(uri string) (muxer av.MuxerCloser, err error) {
Muxer: handler.WriterMuxer(w), Muxer: handler.WriterMuxer(w),
w: w, w: w,
} }
if err = muxer.WriteHeader(streams); err != nil {
return
}
return return
} }
} }
@ -158,17 +179,17 @@ func (self *Handlers) Create(uri string) (muxer av.MuxerCloser, err error) {
return return
} }
var defaultHandlers = &Handlers{} var DefaultHandlers = &Handlers{}
func AddHandler(fn func(*RegisterHandler)) { func AddHandler(fn func(*RegisterHandler)) {
defaultHandlers.Add(fn) DefaultHandlers.Add(fn)
} }
func Open(url string) (demuxer av.Demuxer, err error) { func Open(url string) (demuxer av.DemuxCloser, err error) {
return defaultHandlers.Open(url) return DefaultHandlers.Open(url)
} }
func Create(url string) (muxer av.Muxer, err error) { func Create(url string, streams []av.CodecData) (muxer av.MuxCloser, err error) {
return defaultHandlers.Create(url) return DefaultHandlers.Create(url, streams)
} }