Exemplo n.º 1
0
static int writeGenericSample(FILE_STREAM_T *pStreamIn, uint32_t sampleSize, 
                              void *pCbData, int chunk_idx, uint32_t sampleDurationHz) {

  CBDATA_WRITE_GENERIC_SAMPLE_T *pCbDataGeneric = NULL;
  unsigned int idxByteInSample = 0;
  unsigned int lenRead;
  int idxArena = 0;
  int rc = 0;

  if((pCbDataGeneric = (CBDATA_WRITE_GENERIC_SAMPLE_T *) pCbData) == NULL) {
    return -1;
  }

  while(idxByteInSample < sampleSize) {

    if((lenRead = sampleSize - idxByteInSample) > sizeof(pCbDataGeneric->arena) - idxArena) {
      lenRead = sizeof(pCbDataGeneric->arena) - idxArena;
    }

    if(ReadFileStream(pStreamIn, &pCbDataGeneric->arena[idxArena], lenRead) < 0) {
      return -1;
    }

    if((rc = WriteFileStream(pCbDataGeneric->pStreamOut, 
                             pCbDataGeneric->arena, lenRead + idxArena)) < 0) {
      return -1;
    }
    
    idxArena = 0;
    idxByteInSample += lenRead;
   
  }

  return rc;
}
Exemplo n.º 2
0
int strutil_isTextFile(const char *path) {
  FILE_STREAM_T fs;
  int rc = 0;
  unsigned char buf[256];
  size_t sz;
  size_t idx;
  FILE_OFFSET_T fSize;

  if(OpenMediaReadOnly(&fs, path) != 0) {
    return 0;
  }

  fSize = fs.size;

  while(fs.offset < fSize) {

    sz = sizeof(buf);
    if(fs.offset + sz > fSize) {
      sz = (size_t) (fSize - fs.offset);
    }

    if(ReadFileStream(&fs, buf, sz) != sz) {
      break;
    }

    // Simply check if the file is a text file
    for(idx = 0; idx < sz; idx++) {
      //if(!isascii(buf[idx])) {
      if(!avc_istextchar(buf[idx])) {
        CloseMediaFile(&fs);
        return 0;
      }
    }

    if(fs.offset == fSize) {
      rc = 1;
    }

  }

  CloseMediaFile(&fs);

  return rc;
}
Exemplo n.º 3
0
int esds_cbWriteSample(FILE_STREAM_T *pStreamIn, uint32_t sampleSize, 
                       void *pCbData, int chunkIdx, uint32_t sampleDurationHz) {

  ESDS_CBDATA_WRITE_SAMPLE_T *pCbDataEsds = NULL;
  unsigned int idxByteInSample = 0;
  unsigned int lenRead;
  int idx= 0;
  int rc = 0;

  //fprintf(stderr, "esds_cbWriteSample chunkIdx:%d sampleSize:%d sampleDurationHz:%d\n", chunkIdx, sampleSize, sampleDurationHz);

  if((pCbDataEsds = (ESDS_CBDATA_WRITE_SAMPLE_T *) pCbData) == NULL) {
    return -1;
  }

  if((idx= aac_encodeADTSHdr(pCbDataEsds->bs.buf, pCbDataEsds->bs.sz,
                 &pCbDataEsds->decoderCfg, sampleSize)) < 0) {
    LOG(X_ERROR("Failed to create ADTS header for frame"));
    return -1;
  }

  while(idxByteInSample < sampleSize) {

    if((lenRead = sampleSize - idxByteInSample) > pCbDataEsds->bs.sz - idx) {
      lenRead = pCbDataEsds->bs.sz - idx;
    }

    if(ReadFileStream(pStreamIn, &pCbDataEsds->bs.buf[idx], lenRead) < 0) {
      return -1;
    }

    if((rc = WriteFileStream(pCbDataEsds->pStreamOut, pCbDataEsds->bs.buf, 
                             lenRead + idx)) < 0) {
      return -1;
    }

    idx= 0;
    idxByteInSample += lenRead;

  }

  return rc;
}
Exemplo n.º 4
0
static Bool Read(void* handle, void* buf, S64 size, S64 loop_pos)
{
	SWav* handle2 = reinterpret_cast<SWav*>(handle);
	U8* dst = static_cast<U8*>(buf);
	S64 remain = size;
	while (remain > 0)
	{
		S64 actual_read = static_cast<S64>(ReadFileStream(handle2->FileStream, remain, dst));
		if (actual_read <= 0)
		{
			if (loop_pos == -1)
			{
				memset(dst, 0x00, static_cast<size_t>(remain));
				return True;
			}
			S64 align = handle2->BitsPerSample / 8 * (handle2->Steleo ? 2 : 1);
			SeekFileStream(handle2->FileStream, handle2->Begin + loop_pos / align * align, SEEK_SET);
			continue;
		}
		remain -= actual_read;
		dst += actual_read;
	}
	return False;
}
Exemplo n.º 5
0
int image_open(const char *path, IMAGE_GENERIC_DESCR_T *pImg, 
               enum MEDIA_FILE_TYPE mediaType) {
  int rc = 0;
  uint32_t sz;
  FILE_STREAM_T fs;

  if(!path || !pImg) {
    return -1;
  }

  pImg->mediaType = mediaType;

  memset(&fs, 0, sizeof(fs));
  if(OpenMediaReadOnly(&fs, path) < 0) {
    return -1;
  }

  if(fs.size > IMAGE_MAX_SIZE) {
    LOG(X_ERROR("File %s size %llu exceeds max %d"),
      fs.filename, fs.size, IMAGE_MAX_SIZE);
    rc = -1;
  } else if(fs.size < 4) {
    LOG(X_ERROR("File %s size is too small %llu"), fs.filename, fs.size);
    rc = -1;
  }

  if(rc >= 0) {
    memset(&pImg->bs, 0, sizeof(pImg->bs));
    pImg->bs.sz = (unsigned int) fs.size;
    if(!(pImg->bs.buf = avc_calloc(1, pImg->bs.sz))) {
      rc = -1;
    }
  }

  if(rc >= 0) {
    while(pImg->bs.idx < fs.size) {
      if((sz = (uint32_t) (fs.size - pImg->bs.idx)) > 4096) {
        sz = 4096;
      }
      if((rc = ReadFileStream(&fs, &pImg->bs.buf[pImg->bs.idx], sz)) != sz) {
        rc = -1;
        break;
      }
      pImg->bs.idx += rc;
      
    }
    if(rc >= 0) {
      rc = pImg->bs.idx;
    }
    pImg->bs.idx = 0;
  }

  CloseMediaFile(&fs);

  pImg->width = 0;
  pImg->height = 0;

  if(rc >= 0) {
    switch(mediaType) {
      case MEDIA_FILE_TYPE_PNG:
        png_parse(pImg);
        break;
      case MEDIA_FILE_TYPE_BMP:
        bmp_parse_hdr(pImg);
        break;
      default:
        break;
    }
  }

  return rc;
}
Exemplo n.º 6
0
int metafile_isvalidFile(const char *path) {
  FILE_STREAM_T fs;
  int rc = 0;
  unsigned char buf[128];
  struct stat st;
  size_t sz;
  size_t idx;
  int is_nl = 0;
  FILE_OFFSET_T fSize;

  if(!path) {
    return 0;
  }

  if(fileops_stat(path, &st) != 0 || (st.st_mode & S_IFDIR)) {
    return 0;
  }

  if(OpenMediaReadOnly(&fs, path) != 0) {
    return 0;
  }

  if((fSize = fs.size) > METAFILE_FILE_CHK_SZMAX) {
    fSize = METAFILE_FILE_CHK_SZMAX;
  }

  while(fs.offset < fSize && rc != 1) {

    sz = sizeof(buf);
    if(fs.offset + sz > fSize) {
      sz = (size_t) (fSize - fs.offset);
    }
    if(ReadFileStream(&fs, buf, sz) != sz) {
      break;
    }
 
    for(idx = 0; idx < sz; idx++) {
      if(!avc_istextchar(buf[idx])) {
        CloseMediaFile(&fs);
        return 0;
      }
      if(buf[idx] == '\n') {
        is_nl = 1;
      } else {
        if(is_nl) {
          if(!memcmp(&buf[idx], METAFILE_KEY_FILE, strlen(METAFILE_KEY_FILE)) || 
             !memcmp(&buf[idx], METAFILE_KEY_DEVICE, strlen(METAFILE_KEY_DEVICE)) ||
             !memcmp(&buf[idx], METAFILE_KEY_TITLE, strlen(METAFILE_KEY_TITLE)) ||
             !memcmp(&buf[idx], METAFILE_KEY_DESCRIPTION, strlen(METAFILE_KEY_DESCRIPTION)) ||
             !memcmp(&buf[idx], METAFILE_KEY_IGNORE, strlen(METAFILE_KEY_IGNORE)) ||
             !memcmp(&buf[idx], METAFILE_KEY_RTMP_PROXY, strlen(METAFILE_KEY_RTMP_PROXY)) ||
             !memcmp(&buf[idx], METAFILE_KEY_RTSP_PROXY, strlen(METAFILE_KEY_RTSP_PROXY)) ||
             !memcmp(&buf[idx], METAFILE_KEY_HTTP_PROXY, strlen(METAFILE_KEY_HTTP_PROXY)) ||
             !memcmp(&buf[idx], METAFILE_KEY_METHODS, strlen(METAFILE_KEY_METHODS)) ||
             !memcmp(&buf[idx], METAFILE_KEY_TOKEN, strlen(METAFILE_KEY_TOKEN)) ||
             !memcmp(&buf[idx], METAFILE_KEY_XCODEARGS, strlen(METAFILE_KEY_XCODEARGS))) {
            rc = 1;
            break;
          } 
        }
        is_nl = 0;
      }
    }

  }

  CloseMediaFile(&fs);

  return rc;
}
Exemplo n.º 7
0
void* LoadWav(const Char* path, S64* channel, S64* samples_per_sec, S64* bits_per_sample, S64* total, void(**func_close)(void*), Bool(**func_read)(void*, void*, S64, S64))
{
	*func_close = Close;
	*func_read = Read;

	SWav* result = static_cast<SWav*>(AllocMem(sizeof(SWav)));
	Bool success = False;
	for (; ; )
	{
		result->FileStream = OpenFileStream(path);
		if (result->FileStream == NULL)
		{
			THROW(0xe9170007);
			break;
		}

		U8 str[4];
		if (ReadFileStream(result->FileStream, 4, str) != 4)
			break;
		if (str[0] != 0x52 || str[1] != 0x49 || str[2] != 0x46 || str[3] != 0x46) // 'RIFF'
			break;
		if (!SeekFileStream(result->FileStream, 4, SEEK_CUR))
			break;
		if (ReadFileStream(result->FileStream, 4, str) != 4)
			break;
		if (str[0] != 0x57 || str[1] != 0x41 || str[2] != 0x56 || str[3] != 0x45) // 'WAVE'
			break;

		Bool fmt_chunk = False;
		Bool data_chunk = False;
		for (; ; )
		{
			U32 size;
			if (ReadFileStream(result->FileStream, 4, str) != 4)
				break;
			if (ReadFileStream(result->FileStream, 4, &size) != 4)
				break;
			if (str[0] == 0x66 && str[1] == 0x6d && str[2] == 0x74 && str[3] == 0x20) // 'fmt '
			{
				if ((size_t)size != sizeof(PCMWAVEFORMAT))
					break;
				{
					PCMWAVEFORMAT fmt;
					if (ReadFileStream(result->FileStream, sizeof(PCMWAVEFORMAT), &fmt) != sizeof(PCMWAVEFORMAT))
						break;
					if (fmt.wf.wFormatTag != 1)
						break;
					switch (fmt.wf.nChannels)
					{
						case 1: result->Steleo = False; break;
						case 2: result->Steleo = True; break;
						default:
							THROW(0xe9170008);
							break;
					}
					*channel = static_cast<S64>(fmt.wf.nChannels);
					result->SamplesPerSec = static_cast<U32>(fmt.wf.nSamplesPerSec);
					*samples_per_sec = static_cast<S64>(fmt.wf.nSamplesPerSec);
					result->BitsPerSample = static_cast<U32>(fmt.wBitsPerSample);
					*bits_per_sample = static_cast<S64>(fmt.wBitsPerSample);
				}
				fmt_chunk = True;
				continue;
			}
			if (str[0] == 0x64 && str[1] == 0x61 && str[2] == 0x74 && str[3] == 0x61) // 'data'
			{
				result->WaveSize = size;
				*total = static_cast<S64>(size);
				data_chunk = True;
				break;
			}
			if (!SeekFileStream(result->FileStream, size, SEEK_CUR))
				break;
		}
		if (!fmt_chunk || !data_chunk)
			break;
		result->Begin = TellFileStream(result->FileStream);
		success = True;
		break;
	}
	if (!success)
	{
		FreeMem(result);
		return NULL;
	}

	return result;
}
Exemplo n.º 8
0
int stream_net_h264_getSliceBytes(void *pArg, unsigned char *pBuf, unsigned int len) {
  STREAM_H264_T *pStreamH264 = (STREAM_H264_T *) pArg;
  uint32_t szSlice;
  unsigned int lenToRead = len;
  unsigned int bufIdx = 0;
  unsigned int fsIdxInSlice;

  if(pStreamH264->frame.pSlice == NULL) {
    return 0;
  }

  fsIdxInSlice = pStreamH264->frame.idxInSlice;
  szSlice = pStreamH264->frame.pSlice->content.sizeWr;
  if(pStreamH264->includeAnnexBHdr) {
    szSlice += 4;
  }

  if(len > szSlice - pStreamH264->frame.idxInSlice) {
    LOG(X_WARNING("Decreasing copy length from %u to (%u - %u)"), 
                  len, szSlice, pStreamH264->frame.idxInSlice);
    len = szSlice - pStreamH264->frame.idxInSlice;
  }

  if(pStreamH264->includeAnnexBHdr) {

    if(pStreamH264->frame.idxInSlice < 4) {

      while(pStreamH264->frame.idxInAnnexBHdr < 4 && bufIdx < len) {
        pBuf[bufIdx++] = (pStreamH264->frame.idxInAnnexBHdr == 3 ? 0x01 : 0x00);
        pStreamH264->frame.idxInAnnexBHdr++;
        lenToRead--;
        pStreamH264->frame.idxInSlice++;
      }
    
    }
    if(pStreamH264->frame.idxInSlice < 4) {
      return pStreamH264->frame.idxInSlice;
    } else {
      fsIdxInSlice = pStreamH264->frame.idxInSlice - 4;
    }

  }

/*
  if(pStreamH264->frame.pSlice == &pStreamH264->audSlice) {

    if(fsIdxInSlice + lenToRead > 2) {
      LOG(X_ERROR("Attempt to read AUD[%d] + %d > AUD len: 2\n"),  
                  fsIdxInSlice, lenToRead, 2);
      return -1;
    }

    pBuf[bufIdx] =  pStreamH264->audSlice.hdr;

    //
    // Mpeg4-Part10AVC Table 7-2 "Meaning of primary_pic_type"
    // 3 bits 0 - 7 ((7 << 5) = I,Si,P,SP,B possible slice types in primary coded picture)
    //
    pBuf[bufIdx + 1] = H264_AUD_I_SI_P_SP_B; 

  } else 
*/
  if(pStreamH264->frame.pSlice == &pStreamH264->spsSlice) {

    if(fsIdxInSlice + lenToRead > pStreamH264->pH264->spspps.sps_len) {
      LOG(X_ERROR("Attempt to read sps[%d] + %d > sps len: %d\n"),  
        fsIdxInSlice, lenToRead, pStreamH264->pH264->spspps.sps_len);
      return -1;
    }

    memcpy(&pBuf[bufIdx], &pStreamH264->pH264->spspps.sps[fsIdxInSlice], lenToRead);

  } else if(pStreamH264->frame.pSlice == &pStreamH264->ppsSlice) {

    if(fsIdxInSlice + lenToRead > pStreamH264->pH264->spspps.pps_len) {
      LOG(X_ERROR("Attempt to read pps[%d] + %d > pps len: %d\n"),  
        fsIdxInSlice, lenToRead, pStreamH264->pH264->spspps.pps_len);
      return -1;
    }

    memcpy(&pBuf[bufIdx], &pStreamH264->pH264->spspps.pps[fsIdxInSlice], lenToRead);


  } else {

    if(SeekMediaFile(pStreamH264->frame.pFileStream, 
                      pStreamH264->frame.pSlice->content.fileOffset + 
                      fsIdxInSlice, SEEK_SET) != 0) {
      return -1;
    }

    if(ReadFileStream(pStreamH264->frame.pFileStream, &pBuf[bufIdx], lenToRead) < 0) {
      return -1;
    }

  }

//if(pStreamH264->frame.idxInSlice <= 4) {
//fprintf(stderr, "h264 frameId:%d\n", pStreamH264->frame.frameId);
//if(pStreamH264->frame.pSlice->content.sizeWr > 65530) fprintf(stderr, "\n\n\n\nh264 size:%d\n", pStreamH264->frame.pSlice->content.sizeWr); 
//fprintf(stderr, "h264 size:%d\n", pStreamH264->frame.pSlice->content.sizeWr); 
//avc_dumpHex(stderr, pBuf, 16, 1);
//}

  pStreamH264->frame.idxInSlice += lenToRead;

  return len;
}