pike.git
/
src
/
modules
/
DVB
/
psparser.c
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/src/modules/DVB/psparser.c:1:
+
/*
+
|| This file is part of Pike. For copyright information see COPYRIGHT.
+
|| Pike is distributed under GPL, LGPL and MPL. See the file COPYING
+
|| for more information.
+
*/
-
+
/*
+
* DVB module, PES extractor
+
*
+
* Creator: Honza Petrous <hop@unibase.cz>
+
*
+
*/
+
+
#include "dvb.h"
+
+
#include <stdio.h>
+
#include <sys/types.h>
+
#include <string.h>
+
+
int dvb_pes2es(unsigned char *bufin, int count, struct dvb_es_packet *pkt, int id) {
+
+
unsigned char *cptr = bufin;
+
int i = 0, plen, extf = 0, hlen;
+
int skipped = 0;
+
+
while(i+4 < count && (cptr[0] != 0 || cptr[1] != 0 || cptr[2] != 1 || cptr[3] != id)) {
+
i++;
+
cptr++;
+
skipped++;
+
}
+
if(i+4 > count)
+
return -1;
+
#ifdef DVB_DEBUG
+
if(skipped)
+
printf("skipped: %d\n", skipped);
+
#endif
+
+
switch(cptr[3]) {
+
case 0xC0: case 0xC1: case 0xC2: case 0xC3:
+
case 0xC4: case 0xC5: case 0xC6: case 0xC7:
+
case 0xC8: case 0xC9: case 0xCA: case 0xCB:
+
case 0xCC: case 0xCD: case 0xCE: case 0xCF:
+
case 0xD0: case 0xD1: case 0xD2: case 0xD3:
+
case 0xD4: case 0xD5: case 0xD6: case 0xD7:
+
case 0xD8: case 0xD9: case 0xDA: case 0xDB:
+
case 0xDC: case 0xDD: case 0xDE: case 0xDF:
+
extf = 1;
+
pkt->ptype = DVB_PES_TYPE_AUDIO;
+
break;
+
case 0xE0: case 0xE1: case 0xE2: case 0xE3:
+
case 0xE4: case 0xE5: case 0xE6: case 0xE7:
+
case 0xE8: case 0xE9: case 0xEA: case 0xEB:
+
case 0xEC: case 0xED: case 0xEE: case 0xEF:
+
extf = 1;
+
pkt->ptype = DVB_PES_TYPE_VIDEO;
+
break;
+
case 0xBD:
+
extf = 1;
+
pkt->ptype = DVB_PES_TYPE_PRIVATE;
+
break;
+
default:
+
pkt->ptype = DVB_PES_TYPE_NOPES;
+
extf = 0;
+
break;
+
}
+
+
hlen = extf ? 9 : 6;
+
if(i+hlen > count)
+
return -1;
+
+
plen = (cptr[4] << 8) + cptr[5];
+
if(extf) {
+
pkt->attr[0] = cptr[6];
+
pkt->attr[1] = cptr[7];
+
hlen += cptr[8];
+
}
+
+
if(i+plen+hlen > count)
+
return -1;
+
+
memcpy(pkt->payload, cptr + hlen, plen-hlen+6);
+
pkt->payload_len = plen-hlen+6;
+
pkt->skipped = skipped;
+
+
return i+plen+6;
+
}
Newline at end of file added.