ref: dad1582627ca77f86f0a6c64d9503a36cab8f00c
dir: /flv.c/
#include <u.h>
#include <libc.h>
#include "amf0.h"
#include "flv.h"
enum {
EncH264 = 7,
EncAAC = 10,
};
u8int *
flvscript(u8int *p, u8int *e, int w, int h, int audio)
{
u8int *psz, *d, *p0;
int stream;
u32int ts;
if(p+16 > e){
werrstr("buffer short");
return nil;
}
/* FIXME ever need to change these? */
stream = 0;
ts = 0;
p0 = p;
*p++ = Fvideo;
psz = p;
p = amf0i24(p, e, 0); /* sz set later */
p = amf0i24(p, e, ts);
*p++ = ts>>24;
p = amf0i24(p, e, stream);
d = p;
p = amf0str(p, e, "onMetaData");
p = amf0arr(p, e);
p = amf0i32(p, e, audio ? 5 : 4);
p = amf0kvnum(p, e, "duration", 0.0);
p = amf0kvnum(p, e, "width", w);
p = amf0kvnum(p, e, "height", h);
p = amf0kvnum(p, e, "videocodecid", EncH264);
if(audio)
p = amf0kvnum(p, e, "audiocodecid", EncAAC);
p = amf0end(p, e);
amf0i24(psz, e, p-d);
return amf0i32(p, e, p-p0);
}
u8int *
flvdata(u8int *p, u8int *e, u32int pts, u32int dts, void *data, int sz, int type, int fl)
{
u8int *p0, *psz, *d;
int stream;
/* FIXME ever need to change these? */
stream = 0;
assert(type == Faudio || type == Fvideo);
p0 = p;
*p++ = type;
psz = p;
p = amf0i24(p, e, 0); /* size to be set later */
p = amf0i24(p, e, dts);
*p++ = dts >> 24;
p = amf0i24(p, e, stream);
d = p;
if(type == Faudio){
*p++ = (EncAAC<<4) | 0x0f;
*p++ = (fl & FlHdr) ? 0 : 1;
}
if(type == Fvideo){
*p++ = ((fl & FlKey) ? 0x10 : 0x20) | EncH264;
*p++ = (fl & FlHdr) ? 0 : 1;
pts = ((fl & FlHdr) || pts < dts) ? 0 : (pts - dts);
p = amf0i24(p, e, pts);
if((fl & FlHdr) == 0)
p = amf0i32(p, e, sz);
}
p = (u8int*)memmove(p, data, sz) + sz;
amf0i24(psz, e, p-d);
return amf0i32(p, e, p-p0);
}