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; iF[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; inF; i++) {
    if (!D->F[i].lost || D->F[i].type == 'H') {
      for (j=0; jF[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; inP; 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