www.pudn.com > eval-1.2.zip > write.c
#include#include #include "def.h" #include "mpeg-4.h" #include "misc.h" #include "read.h" #include "write.h" #include "random.h" #define BE 128 #define PS 64 static const char FMT_T[] = "%10.6f SRC > DST (%d): udp %lu (ttl 64, id %lu, lost %d)\n"; int WriteRD(char *s, dump_t *D, unsigned l) { FILE *f; unsigned i; if ((f = fopen(s, "w")) != 0) { for (i=0; i F[0].size, 1, fi) != 1) { fprintf(stderr, "error reading %s\n", s); return 0; } resetbuf(); if (!VOLheader(buf, D->F[0].size, &VOL_h)) return 0; if (!fwrite(buf, D->F[0].size, 1, fo)) { fprintf(stderr, "error writing %s\n", d); return 0; } for (k=D->F[0].segm, i=1; i nF; i++) { if (!D->F[i].lost || D->F[i].type == 'H') { for (j=0; j F[i].segm; j++, k++) { if (!D->P[k].size || D->P[k].size > sizeof buf) { fprintf(stderr, "stupid packet size\n"); return 0; } if (fread(buf, D->P[k].size, 1, fi) != 1) { fprintf(stderr, "error reading %s\n", s); return 0; } if (!D->P[k].lost) { if (D->P[k].type != 'H' && !fwrite(buf, D->P[k].size, 1, fo)) { fprintf(stderr, "error writing %s\n", d); return 0; } } } } else { if (fread(buf, D->F[i].size, 1, fi) != 1) { fprintf(stderr, "error reading %s\n", s); return 0; } resetbuf(); k += D->F[i].segm; size = VOP_not_coded(buf, &VOL_h); if (!skip) if (D->F[i].type != 'H' && !fwrite(buf, 64 + size, 1, fo)) { fprintf(stderr, "error writing %s\n", d); return 0; } } } printf("%lu\n", k); fclose(fo); fclose(fi); return 1; } int WriteRTP(char *s, char *d, data_t *D) { FILE *fi = 0, *fo = 0; char buf[0xffff]; unsigned long i; if ((fi = fopen(s, "rb")) == 0) { fprintf(stderr, "error opening %s\n", s); return 0; } if ((fo = fopen(d, "wb")) == 0) { fprintf(stderr, "error opening %s\n", d); return 0; } for (i=0; i nP; i++) { if (fread(buf, D->P[i].size, 1, fi) != 1) { fprintf(stderr, "error reading %s\n", s); return 0; } if (!D->P[i].lost) { /* A. Lie: Copy binary data to output file if not simulated to lost!! */ if (fwrite(buf, D->P[i].size, 1, fo) != 1) { fprintf(stderr, "error writing %s\n", d); return 0; } } } fclose(fo); fclose(fi); return 1; } /* int FixYUV(char *fn[], const dump_t *pF, unsigned l) */ int FixYUV(char *fn[], dump_t *pF, unsigned l) { FILE *fi, *fo; char buf[L] = {0}; #ifdef PLAYOUT_TIME_LMTD int file_rew; fpos_t where_now; #endif unsigned i = 0, j = 0, nlf = 0, delay = 0; if ((fi = fopen(fn[4], "rb")) == 0) { fprintf(stderr, "error opening %s\n", fn[4]); return 0; } if ((fo = fopen(fn[5], "wb")) == 0) { fprintf(stderr, "error opening %s\n", fn[5]); return 0; } while (i < l) { if (!pF[i].lost || i==0) /* Remember L is the number of bytes per YUV420 CIF-sized frame */ { if (1 != fread(buf, L, 1, fi)) /* break; */ printf("Should break...\n"); j++; #ifdef PLAYOUT_TIME_LMTD pF[i+1].use = i; /* Signal that this frame can be used at next interval if necessary */ #endif } else if (pF[i].lost==1) { nlf++; /* count number of lost frames */ } #ifdef PLAYOUT_TIME_LMTD else { /* lost > 1 means a delay constraint, frame arrived too late, can be used later write to file with older frame */ /* printf("This frame can be used at frame index %d\n",pF[i].play); */ delay++; if (1 != fread(buf, L, 1, fi)) break; pF[pF[i].play].use = i; /* Indicate in advance of time who can use THIS frame */ fgetpos(fi,&where_now); file_rew = (int)((pF[i].use-i-1)*L); fseek(fi,file_rew,SEEK_CUR); if (1 != fread(buf, L, 1, fi)) break; fsetpos(fi,&where_now); if (pF[i+1].use == 0) pF[i+1].use = pF[i].use; } #endif if (1 != fwrite(buf, L, 1, fo)) { fprintf(stderr, "error writing %s\n", fn[5]); break; } i++; if (!(i%500)) printf("%d frames processed...\n",i); } fclose(fi); fclose(fo); printf("%d lost frames detected and replaced by previous frame!\n",nlf); printf("#of frames lost=%d. #of frames slipped render time=%d. #of frames received in time=%d\n",nlf,delay,j); return (nlf+delay+j); } int GenRD_Prio(char *fn, dump_t *pP, unsigned l, unsigned BER) { FILE *f; const unsigned HEAD = 8 * (22 + 20 + 8 + 16); /* 802.11 + IP + UDP + RTP */ const unsigned OVRH = 250; /* ACK timeout + ACK transmission [micro sec] */ const unsigned BPS[] = {11000000, 5500000, 2000000, 1000000}; union { unsigned N[3]; unsigned I, P, B; } RETR = {8, 8, 8}, RATE = {2, 2, 2}, retry; unsigned num[PS] = {0}, hist[BE][PS] = {0}; unsigned i=0, j, n, m, N=0, type, ber; double bm=0, t; while (i n) n = i; if (j > m) m = j; } for (i=0; i PoB) t = PoB, pP[i].lost = 1; pP[i].t2 = (i ? MAX(pP[i-1].t2, pP[i].t1) : pP[i].t1) + t; i++; } printf("%g\n", bm / N); if ((f = fopen(fn, "w")) != 0) { for (i=0; i PoB) t = PoB, pP[i].lost = 1; pP[i].t2 = (i ? MAX(pP[i-1].t2, pP[i].t1) : pP[i].t1) + t; i++; } printf("%g\n", bm / N); if ((f = fopen(fn, "w")) != 0) { for (i=0; i