REBVAL *N_watch(REBFRM *frame, REBVAL **inter_block) { WatchVar = Get_Word(FRM_ARG1(frame)); Watcher = VAL_SERIES(WatchVar); SET_INTEGER(FRM_ARG1(frame), 0); return Nothing; }
/* parse system layer, ignore everything we don't need */ void Next_Packet() { unsigned int code; int l; for(;;) { code = Get_Long(); /* remove system layer byte stuffing */ while ((code & 0xffffff00) != 0x100) code = (code<<8) | Get_Byte(); switch(code) { case PACK_START_CODE: /* pack header */ /* skip pack header (system_clock_reference and mux_rate) */ ld->Rdptr += 8; break; case VIDEO_ELEMENTARY_STREAM: code = Get_Word(); /* packet_length */ ld->Rdmax = ld->Rdptr + code; code = Get_Byte(); if((code>>6)==0x02) { ld->Rdptr++; code=Get_Byte(); /* parse PES_header_data_length */ ld->Rdptr+=code; /* advance pointer by PES_header_data_length */ //printf("MPEG-2 PES packet\n"); return; } else if(code==0xff) { /* parse MPEG-1 packet header */ while((code=Get_Byte())== 0xFF); } /* stuffing bytes */ if(code>=0x40) { if(code>=0x80) { fprintf(stderr,"Error in packet header\n"); exit(1); } /* skip STD_buffer_scale */ ld->Rdptr++; code = Get_Byte(); } if(code>=0x30) { if(code>=0x40) { fprintf(stderr,"Error in packet header\n"); exit(1); } /* skip presentation and decoding time stamps */ ld->Rdptr += 9; } else if(code>=0x20) { /* skip presentation time stamps */ ld->Rdptr += 4; } else if(code!=0x0f) { fprintf(stderr,"Error in packet header\n"); exit(1); } return; case ISO_END_CODE: /* end */ /* simulate a buffer full of sequence end codes */ l = 0; while (l<2048) { ld->Rdbfr[l++] = SEQUENCE_END_CODE>>24; ld->Rdbfr[l++] = SEQUENCE_END_CODE>>16; ld->Rdbfr[l++] = SEQUENCE_END_CODE>>8; ld->Rdbfr[l++] = SEQUENCE_END_CODE&0xff; } ld->Rdptr = ld->Rdbfr; ld->Rdmax = ld->Rdbfr + 2048; return; default: if(code>=SYSTEM_START_CODE) { /* skip system headers and non-video packets*/ code = Get_Word(); ld->Rdptr += code; } else { fprintf(stderr,"Unexpected startcode %08x in system layer\n",code); exit(1); } break; } }