ref: db8bb1cf65a89e025244786c70ba5fc76d9e3fc3
dir: /decoder.c/
#include <u.h> #include <libc.h> #include <thread.h> #include "stream.h" #include "decoder.h" #include "frame.h" extern Decoderops av1ops, h264ops, vpxops; static struct { char *name; Decoderops *o; int fmt; }ops[] = { {"AV1", &av1ops, FmtAV1}, {"H264", &h264ops, FmtH264}, {"VP8", &vpxops, FmtVP8}, {"VP9", &vpxops, FmtVP9}, }; Decoder * Dopen(Stream *s) { Decoder *d; int i; if((d = calloc(1, sizeof(*d))) == nil) return nil; d->timebase = (double)s->timebase.num/(double)s->timebase.denum; d->s = s; d->frames = chancreate(sizeof(Frame*), 8); d->finished = chancreate(sizeof(void*), 0); for(i = 0; i < nelem(ops); i++){ if(ops[i].fmt == s->fmt){ if(ops[i].o->open(d) < 0){ werrstr("%s: %r", ops[i].name); goto err; } d->ops = ops[i].o; snprint(d->info, sizeof(d->info), "%s", ops[i].name); break; } } assert(i < nelem(ops)); return d; err: return nil; } void Dclose(Decoder *d) { d->ops->close(d); chanclose(d->frames); recvp(d->finished); free(d); }