⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rmff.cpp

📁 本源码包
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include	<stdio.h>#include	<string.h>#include	"rmff.h"/*#define	uint16_t	(unsigned short)#define	uint32_t	(unsigned int)*/				#define BE_16(x)  ((((uint8_t*)(x))[0] << 8) | ((uint8_t*)(x))[1])#define BE_32(x)  ((((uint8_t*)(x))[0] << 24) | \                   (((uint8_t*)(x))[1] << 16) | \                   (((uint8_t*)(x))[2] << 8) | \                    ((uint8_t*)(x))[3])static void hexdump (const char *buf, int length) {  int i;  printf ("rmff: ascii>");  for (i = 0; i < length; i++) {    unsigned char c = buf[i];    if ((c >= 32) && (c <= 128))      printf ("%c", c);    else      printf (".");  }  printf ("\n");  printf ("rmff: hexdump> ");  for (i = 0; i < length; i++) {    unsigned char c = buf[i];    printf ("%02x", c);    if ((i % 16) == 15)      printf ("\nrmff:         ");    if ((i % 2) == 1)      printf (" ");  }  printf ("\n");}/* * writes header data to a buffer */static void rmff_dump_fileheader(rmff_fileheader_t *fileheader, char *buffer) {  if (!fileheader) return;  fileheader->object_id=BE_32(&fileheader->object_id);  fileheader->size=BE_32(&fileheader->size);  fileheader->object_version=BE_16(&fileheader->object_version);  fileheader->file_version=BE_32(&fileheader->file_version);  fileheader->num_headers=BE_32(&fileheader->num_headers);    memcpy(buffer, fileheader, 8);  memcpy(&buffer[8], &fileheader->object_version, 2);  memcpy(&buffer[10], &fileheader->file_version, 8);    fileheader->size=BE_32(&fileheader->size);
  fileheader->object_version=BE_16(&fileheader->object_version);
  fileheader->file_version=BE_32(&fileheader->file_version);
  fileheader->num_headers=BE_32(&fileheader->num_headers);
  fileheader->object_id=BE_32(&fileheader->object_id);}static void rmff_dump_prop(rmff_prop_t *prop, char *buffer) {  	if (!prop)   		return;  prop->object_id=BE_32(&prop->object_id);  prop->size=BE_32(&prop->size);  prop->object_version=BE_16(&prop->object_version);  prop->max_bit_rate=BE_32(&prop->max_bit_rate);  prop->avg_bit_rate=BE_32(&prop->avg_bit_rate);  prop->max_packet_size=BE_32(&prop->max_packet_size);  prop->avg_packet_size=BE_32(&prop->avg_packet_size);  prop->num_packets=BE_32(&prop->num_packets);  prop->duration=BE_32(&prop->duration);  prop->preroll=BE_32(&prop->preroll);  prop->index_offset=BE_32(&prop->index_offset);  prop->data_offset=BE_32(&prop->data_offset);  prop->num_streams=BE_16(&prop->num_streams);  prop->flags=BE_16(&prop->flags);  memcpy(buffer, &prop -> object_id, 4);   memcpy(&buffer[4], &prop -> size, 4);  memcpy(&buffer[8], &prop->object_version, 2);  memcpy(&buffer[10], &prop->max_bit_rate, 36);  memcpy(&buffer[46], &prop->num_streams, 2);  memcpy(&buffer[48], &prop->flags, 2);  prop->size=BE_32(&prop->size);
  prop->object_version=BE_16(&prop->object_version);
  prop->max_bit_rate=BE_32(&prop->max_bit_rate);
  prop->avg_bit_rate=BE_32(&prop->avg_bit_rate);
  prop->max_packet_size=BE_32(&prop->max_packet_size);
  prop->avg_packet_size=BE_32(&prop->avg_packet_size);
  prop->num_packets=BE_32(&prop->num_packets);
  prop->duration=BE_32(&prop->duration);
  prop->preroll=BE_32(&prop->preroll);
  prop->index_offset=BE_32(&prop->index_offset);
  prop->data_offset=BE_32(&prop->data_offset);
  prop->num_streams=BE_16(&prop->num_streams);
  prop->flags=BE_16(&prop->flags);
  prop->object_id=BE_32(&prop->object_id);}static void rmff_dump_mdpr(rmff_mdpr_t *mdpr, char *buffer) {  int s1, s2, s3;  if (!mdpr) return;  mdpr->object_id=BE_32(&mdpr->object_id);  mdpr->size=BE_32(&mdpr->size);  mdpr->object_version=BE_16(&mdpr->object_version);  mdpr->stream_number=BE_16(&mdpr->stream_number);  mdpr->max_bit_rate=BE_32(&mdpr->max_bit_rate);  mdpr->avg_bit_rate=BE_32(&mdpr->avg_bit_rate);  mdpr->max_packet_size=BE_32(&mdpr->max_packet_size);  mdpr->avg_packet_size=BE_32(&mdpr->avg_packet_size);  mdpr->start_time=BE_32(&mdpr->start_time);  mdpr->preroll=BE_32(&mdpr->preroll);  mdpr->duration=BE_32(&mdpr->duration);  memcpy(buffer, mdpr, 8);  memcpy(&buffer[8], &mdpr->object_version, 2);  memcpy(&buffer[10], &mdpr->stream_number, 2);  memcpy(&buffer[12], &mdpr->max_bit_rate, 28);  memcpy(&buffer[40], &mdpr->stream_name_size, 1);  s1 = 0x000000ff & mdpr->stream_name_size;  memcpy(&buffer[41], mdpr->stream_name, s1);  memcpy(&buffer[41 + s1], &mdpr->mime_type_size, 1);  s2 = 0x000000ff & mdpr->mime_type_size;  memcpy(&buffer[42+s1], mdpr->mime_type, s2);    mdpr->type_specific_len=BE_32(&mdpr->type_specific_len);  memcpy(&buffer[42+s1+s2], &mdpr->type_specific_len, 4);  mdpr->type_specific_len=BE_32(&mdpr->type_specific_len);  s3 = 0x000000ff & mdpr->type_specific_len;  memcpy(&buffer[46+s1+s2], mdpr->type_specific_data, s3);      mdpr->size=BE_32(&mdpr->size);
  mdpr->stream_number=BE_16(&mdpr->stream_number);
  mdpr->max_bit_rate=BE_32(&mdpr->max_bit_rate);
  mdpr->avg_bit_rate=BE_32(&mdpr->avg_bit_rate);
  mdpr->max_packet_size=BE_32(&mdpr->max_packet_size);
  mdpr->avg_packet_size=BE_32(&mdpr->avg_packet_size);
  mdpr->start_time=BE_32(&mdpr->start_time);
  mdpr->preroll=BE_32(&mdpr->preroll);
  mdpr->duration=BE_32(&mdpr->duration);
  mdpr->object_id=BE_32(&mdpr->object_id);}static void rmff_dump_cont(rmff_cont_t *cont, char *buffer) {  int p;  if (!cont) 	  return;  cont -> object_id = BE_32( &cont -> object_id);  cont->size=BE_32(&cont->size);  cont->object_version=BE_16(&cont->object_version);  memcpy(buffer, cont, 8);  memcpy(&buffer[8], &cont->object_version, 2);    cont->title_len=BE_16(&cont->title_len);  memcpy(&buffer[10], &cont->title_len, 2);  cont->title_len=BE_16(&cont->title_len);  memcpy(&buffer[12], cont->title, cont->title_len);  p=12+cont->title_len;  cont->author_len=BE_16(&cont->author_len);  memcpy(&buffer[p], &cont->author_len, 2);  cont->author_len=BE_16(&cont->author_len);  memcpy(&buffer[p+2], cont->author, cont->author_len);  p+=2+cont->author_len;  cont->copyright_len=BE_16(&cont->copyright_len);  memcpy(&buffer[p], &cont->copyright_len, 2);  cont->copyright_len=BE_16(&cont->copyright_len);  memcpy(&buffer[p+2], cont->copyright, cont->copyright_len);  p+=2+cont->copyright_len;  cont->comment_len=BE_16(&cont->comment_len);  memcpy(&buffer[p], &cont->comment_len, 2);  cont->comment_len=BE_16(&cont->comment_len);  memcpy(&buffer[p+2], cont->comment, cont->comment_len);  cont->size=BE_32(&cont->size);  cont->object_version=BE_16(&cont->object_version);  cont->object_id=BE_32(&cont->object_id);}static void rmff_dump_dataheader(rmff_data_t *data, char *buffer) {  if (!data) return;  data->object_id=BE_32(&data->object_id);  data->size=BE_32(&data->size);  data->object_version=BE_16(&data->object_version);  data->num_packets=BE_32(&data->num_packets);  data->next_data_header=BE_32(&data->next_data_header);  memcpy(buffer, data, 8);  memcpy(&buffer[8], &data->object_version, 2);  memcpy(&buffer[10], &data->num_packets, 8);      data->num_packets=BE_32(&data->num_packets);
  data->next_data_header=BE_32(&data->next_data_header);
  data->size=BE_32(&data->size);
  data->object_version=BE_16(&data->object_version);
  data->object_id=BE_32(&data->object_id);}int rmff_dump_header(rmff_header_t *h, char *buffer, int max) {  	int 		written=0;  	  	if(h == NULL)  		return	-1;  	rmff_mdpr_t **stream = h->streams;  	rmff_dump_fileheader(h->fileheader, &buffer[written]);  	written += h->fileheader->size;  	rmff_dump_prop(h->prop, &buffer[written]);  	written += h->prop->size;  	rmff_dump_cont(h->cont, &buffer[written]);  	written+=h->cont->size;  	if (stream)  	{    	while(*stream)    		{      	rmff_dump_mdpr(*stream, &buffer[written]);      	written+=(*stream)->size;     	 	stream++;    		}  	}      	rmff_dump_dataheader(h->data, &buffer[written]);  	written+=18;  	if(written < max)  		return written;	else		return	-1;}void rmff_dump_pheader(rmff_pheader_t *h, char *data) {  data[0]=(h->object_version>>8) & 0xff;  data[1]=h->object_version & 0xff;  data[2]=(h->length>>8) & 0xff;  data[3]=h->length & 0xff;  data[4]=(h->stream_number>>8) & 0xff;  data[5]=h->stream_number & 0xff;  data[6]=(h->timestamp>>24) & 0xff;  data[7]=(h->timestamp>>16) & 0xff;  data[8]=(h->timestamp>>8) & 0xff;  data[9]=h->timestamp & 0xff;  data[10]=h->reserved;  data[11]=h->flags;}static rmff_fileheader_t *rmff_scan_fileheader(const char *data) {  rmff_fileheader_t *fileheader = new rmff_fileheader_t;  fileheader->object_id=BE_32(data);  fileheader->size=BE_32(&data[4]);  fileheader->object_version=BE_16(&data[8]);  if (fileheader->object_version != 0)  {    printf("warning: unknown object version in .RMF: 0x%04x\n",      fileheader->object_version);  }  fileheader->file_version=BE_32(&data[10]);  fileheader->num_headers=BE_32(&data[14]);  return fileheader;}rmff_fileheader_t	*rmff_new_fileheader(unsigned int count){	rmff_fileheader_t	*header = new rmff_fileheader_t;	header -> object_id = RMF_TAG;	header -> size      = 18;	header -> object_version = 0;	header -> file_version = 0;	header -> num_headers = count;		return	header;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -