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

📄 rmff.c

📁 linux下流媒体下载程序代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    mdpr->mime_type_size=0;    if (mime_type) {	mdpr->mime_type=strdup(mime_type);	mdpr->mime_type_size=strlen(mime_type);    }    mdpr->type_specific_len=type_specific_len;    mdpr->type_specific_data = xmalloc(sizeof(char)*type_specific_len);    memcpy(mdpr->type_specific_data,type_specific_data,type_specific_len);    mdpr->mlti_data=NULL;      mdpr->size=mdpr->stream_name_size+mdpr->mime_type_size+mdpr->type_specific_len+46;    return mdpr;}struct rmff_cont_t *new_rmff_cont(const char *title, const char *author, const char *copyright, const char *comment){    struct rmff_cont_t *cont = xmalloc(sizeof(struct rmff_cont_t));    cont->object_id=CONT_TAG;    cont->object_version=0;    cont->title=NULL;    cont->author=NULL;    cont->copyright=NULL;    cont->comment=NULL;      cont->title_len=0;    cont->author_len=0;    cont->copyright_len=0;    cont->comment_len=0;      if (title) {	cont->title_len=strlen(title);	cont->title=strdup(title);    }    if (author) {	cont->author_len=strlen(author);	cont->author=strdup(author);    }    if (copyright) {	cont->copyright_len=strlen(copyright);	cont->copyright=strdup(copyright);    }    if (comment) {	cont->comment_len=strlen(comment);	cont->comment=strdup(comment);    }    cont->size=cont->title_len+cont->author_len+cont->copyright_len+cont->comment_len+18;    return cont;}struct rmff_data_t *new_rmff_dataheader(uint32_t num_packets,					uint32_t next_data_header){      struct rmff_data_t *data = xmalloc(sizeof(struct rmff_data_t));    data->object_id=DATA_TAG;    data->size=18;    data->object_version=0;    data->num_packets=num_packets;    data->next_data_header=next_data_header;    return data;} /* * totaly based on xine-lib rmff_print_header function * print rmff_header */void rmff_print_header(struct rmff_header_t *h){    struct rmff_mdpr_t *stream;    if(!h) return;      display(MSDL_DBG,"=----- RMFF header -----=\n");    if(h->fileheader) {	display(MSDL_DBG,		"FILE:\n"		"      file version      : %d\n"		"      number of headers : %d\n",		h->fileheader->file_version,		h->fileheader->num_headers);    }      if(h->cont) {	display(MSDL_DBG,		"CONT:\n"		"      title      : %s\n"		"      author     : %s\n"		"      copyright  : %s\n"		"      comment    : %s\n",		h->cont->title,h->cont->author,		h->cont->copyright,h->cont->comment);    }    if(h->prop) {	char flags[100]; /* this is enough */	snprintf(flags,100,"%s %s %s\n",		 (h->prop->flags & PN_SAVE_ENABLED) ? "save_enabled" : "",		 (h->prop->flags & PN_PERFECT_PLAY_ENABLED) ? "perfect_play_enabled" : "",		 (h->prop->flags & PN_LIVE_BROADCAST) ? "live_broadcast" : "");        	display(MSDL_DBG,		"PROP:\n"		"      bitrate (max/avg)     : %i/%i\n"		"      packet size(max/avg)  : %i/%i\n"		"      packets        : %i\n"		"      duration       : %i\n"		"      pre-buffer     : %i\n"		"      index_offset   : %i (%x)\n"		"      data offset    : %i (%x)\n"		"      media streams  : %i\n"		"      flags          : %s\n",		h->prop->max_bit_rate,h->prop->avg_bit_rate,		h->prop->max_packet_size,h->prop->avg_packet_size,		h->prop->num_packets,		h->prop->duration,		h->prop->preroll,		h->prop->index_offset,h->prop->index_offset,		h->prop->data_offset,h->prop->data_offset,		h->prop->num_streams,		flags);    }        if(h->streams) {	int i;	for(i = 0 ; (stream = h->streams[i]) ; i++) {	    display(MSDL_DBG,		    "STREAM %i:\n"		    "      stream name [mime-type]  : %s [%s]\n"		    "      bitrate (max/avg)        : %i/%i\n"		    "      packet size (max/avg)    : %i/%i\n"		    "      start time   : %i\n"		    "      pre-buffer   : %i ms\n"		    "      duration     : %i ms\n"		    "      type specific data : %d bytes\n",		    stream->stream_number,		    stream->stream_name,stream->mime_type,		    stream->max_bit_rate,stream->avg_bit_rate,		    stream->max_packet_size,stream->avg_packet_size,		    stream->start_time,		    stream->preroll,		    stream->duration,		    stream->type_specific_len);      	    dbgdump(stream->type_specific_data,stream->type_specific_len);	    display(MSDL_DBG,"\n");	}    }      if(h->data) {	display(MSDL_DBG,		"DATA:\n"		"      size      : %i\n"		"      packets   : %i\n"		"      next DATA : 0x%08x\n",		h->data->size,		h->data->num_packets,		h->data->next_data_header);    }  }/* * totaly based on xine-lib rmff_fix_header function * fix rmff header to write at the beginning of file */void rmff_fix_header(struct rmff_header_t *h){    unsigned int num_headers=0;    unsigned int header_size=0;    struct rmff_mdpr_t **streams;    int num_streams=0;    if (!h) {	display(MSDL_ERR,"rmff_fix_header: fatal: no header given.\n");	return;    }    if (!h->streams) {	display(MSDL_DBG,"rmff_fix_header: warning: no MDPR chunks\n");    }    else {	streams=h->streams;	while (*streams) {	    num_streams++;	    num_headers++;	    header_size+=(*streams)->size;	    streams++;	}    }      if (h->prop) {	if (h->prop->size != 50) {	    display(MSDL_DBG,"rmff_fix_header: correcting prop.size from %i to %i\n",		    h->prop->size, 50);	    h->prop->size=50;	}	if (h->prop->num_streams != num_streams) {	    display(MSDL_DBG,"rmff_fix_header: correcting prop.num_streams from %i to %i\n",		    h->prop->num_streams, num_streams);	    h->prop->num_streams=num_streams;	}	num_headers++;	header_size+=50;    }     else	display(MSDL_ERR,"rmff_fix_header: warning: no PROP chunk.\n");      if (h->cont) {	num_headers++;	header_size+=h->cont->size;    }    else	display(MSDL_DBG,"rmff_fix_header: warning: no CONT chunk.\n");    if (!h->data) {	display(MSDL_DBG,"rmff_fix_header: no DATA chunk, creating one\n");    	h->data = xmalloc(sizeof(struct rmff_data_t));	h->data->object_id=DATA_TAG;	h->data->object_version=0;	h->data->size=34;	h->data->num_packets=0;	h->data->next_data_header=0;    }    num_headers++;      if (!h->fileheader) {	display(MSDL_DBG,"rmff_fix_header: no fileheader, creating one");	h->fileheader = xmalloc(sizeof(struct rmff_fileheader_t));	h->fileheader->object_id=RMF_TAG;	h->fileheader->size=34;	h->fileheader->object_version=0;	h->fileheader->file_version=0;	h->fileheader->num_headers=num_headers+1;    }    header_size+=h->fileheader->size;    num_headers++;    if(h->fileheader->num_headers != num_headers) {	display(MSDL_DBG,"rmff_fix_header: setting num_headers from %i to %i\n",		h->fileheader->num_headers, num_headers); 	h->fileheader->num_headers=num_headers;    }    if(h->prop) {	if (h->prop->data_offset != header_size) {	    display(MSDL_DBG,"rmff_fix_header: setting prop.data_offset from %i to %i\n",		    h->prop->data_offset, header_size);       	    h->prop->data_offset=header_size;	}	if (h->prop->num_packets == 0) {	    int p=(int)(h->prop->avg_bit_rate/8.0*(h->prop->duration/1000.0)/h->prop->avg_packet_size);	    display(MSDL_DBG,"rmff_fix_header: assuming prop.num_packets=%i\n", p); 	    h->prop->num_packets=p;	}	if (h->data->num_packets == 0) {	    display(MSDL_DBG,"rmff_fix_header: assuming data.num_packets=%i\n",		    h->prop->num_packets); 	    h->data->num_packets=h->prop->num_packets;	}    	display(MSDL_DBG,"rmff_fix_header: assuming data.size=%i\n",		h->prop->num_packets*h->prop->avg_packet_size);     	h->data->size=h->prop->num_packets*h->prop->avg_packet_size;    }}int rmff_get_header_size(struct rmff_header_t *h){    if (!h) return 0;    if (!h->prop) return -1;    return h->prop->data_offset+18;  }void free_rmff_header_t(struct rmff_header_t *h){    if (!h) return;    if (h->fileheader) free(h->fileheader);    if (h->prop) free(h->prop);    if (h->data) free(h->data);    if (h->cont) {	free(h->cont->title);	free(h->cont->author);	free(h->cont->copyright);	free(h->cont->comment);	free(h->cont);    }    if (h->streams) {	struct rmff_mdpr_t **s=h->streams;	while(*s) {	    free((*s)->stream_name);	    free((*s)->mime_type);	    free((*s)->type_specific_data);	    free(*s);	    s++;	}	free(h->streams);    }    free(h);}

⌨️ 快捷键说明

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