~ft/mcfs

721b071f9ec209ead60c7c0ddf993e6e495f8b24 — Sigrid Solveig Haflínudóttir 2 years ago f7bc176
ogg: simplify
1 files changed, 34 insertions(+), 41 deletions(-)

M ogg.c
M ogg.c => ogg.c +34 -41
@@ 75,7 75,7 @@ oggpacket(Biobuf *out, Packetctx *ctx, Packet *p, int np, uvlong ts)
{
	/*                     magic                            vendor len   list len */
	u8int opuscomment[] = {'O','p','u','s','T','a','g','s', 0,0,0,0,     0,0,0,0};
	int r, i, nsg, dsz, total;
	int i, nsg, dsz, total;
	u8int *d;
	u64int gr;
	int sgszs[4];


@@ 84,57 84,50 @@ oggpacket(Biobuf *out, Packetctx *ctx, Packet *p, int np, uvlong ts)
	ts += ctx->seekpreroll - ctx->discardpad;
	gr = (ts * 48) / 1000000;

	r = 0;
	if(ctx->frid == 0){ /* first packet? */
		d = ctx->codec.priv.data;
		dsz = ctx->codec.priv.sz;

		if(dsz < 1){
			werrstr("codec private data missing");
			goto err;
		}

		/* id/codec setup header always goes first */
		if(dsz > 0){ /* if we have codec setup data, write it */
			if(ctx->fmt == FmtVorbis || ctx->fmt == FmtTheora){
				i = *d++;
				dsz--;
				for(nsg = 0, total = 0; i > 0 && dsz > 0; total += sgszs[nsg], nsg++){
					sgszs[nsg] = 0;
					do{
						sgszs[nsg] += *d;
						dsz--;
						i--;
					}while(*d++ == 0xff);
				}
				if(total > dsz){
					werrstr("setup data out of bounds");
					goto err;
				}
				for(i = 0; i < nsg && dsz > 0; d += sgszs[i], dsz -= sgszs[i], i++){
					onep.data = d;
					onep.sz = sgszs[i];
					if(packet(out, ctx, i == 0 ? 2 : 0, &onep, 1, 0) != 0)
						goto err;
				}
				if(dsz > 0){
					onep.data = d;
					onep.sz = dsz;
					r = packet(out, ctx, 0, &onep, 1, 0);
				}
			}else{
		if(ctx->fmt == FmtVorbis || ctx->fmt == FmtTheora){
			i = *d++;
			dsz--;
			for(nsg = 0, total = 0; i > 0 && dsz > 0; total += sgszs[nsg], nsg++){
				sgszs[nsg] = 0;
				do{
					sgszs[nsg] += *d;
					dsz--;
					i--;
				}while(*d++ == 0xff);
			}
			if(total > dsz){
				werrstr("setup data out of bounds");
				goto err;
			}
			for(i = 0; i < nsg && dsz > 0; d += sgszs[i], dsz -= sgszs[i], i++){
				onep.data = d;
				onep.sz = dsz;
				r = packet(out, ctx, 2, &onep, 1, 0);
				onep.sz = sgszs[i];
				if(packet(out, ctx, i == 0 ? 2 : 0, &onep, 1, 0) != 0)
					goto err;
			}
		}
		/* otherwise let's hope the first packet has that data itself */
		if(r != 0)
			goto err;

		/* comment */
		if(ctx->fmt == FmtOpus){
		if(dsz > 0){ /* either leftovers or other codecs, write as is */
			onep.data = d;
			onep.sz = dsz;
			if(packet(out, ctx, 2, &onep, 1, 0) != 0)
				goto err;
		}
		if(ctx->fmt == FmtOpus){ /* Opus requires a comment */
			onep.data = opuscomment;
			onep.sz = sizeof(opuscomment);
			r = packet(out, ctx, 0, &onep, 1, 0);
			if(packet(out, ctx, 0, &onep, 1, 0) != 0)
				goto err;
		}
		if(r != 0)
			goto err;
	}

	if(np > 0 && packet(out, ctx, ctx->discardpad ? 4 : 0, p, np, gr) != 0)