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

📄 mp4tagupdate.c

📁 betaplayer的源码 tcpmp的老版本
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdlib.h>#include <string.h>#include "mp4ffint.h"#ifdef USE_TAGGINGstatic uint32_t fix_byte_order_32(uint32_t src){    uint32_t result;    uint32_t a, b, c, d;    int8_t data[4];        memcpy(data,&src,sizeof(src));    a = (uint8_t)data[0];    b = (uint8_t)data[1];    c = (uint8_t)data[2];    d = (uint8_t)data[3];    result = (a<<24) | (b<<16) | (c<<8) | d;    return (uint32_t)result;}static uint16_t fix_byte_order_16(uint16_t src){    uint16_t result;    uint16_t a, b;    int8_t data[2];        memcpy(data,&src,sizeof(src));    a = (uint8_t)data[0];    b = (uint8_t)data[1];    result = (a<<8) | b;    return (uint16_t)result;}typedef struct{	void * data;	unsigned written;	unsigned allocated;	unsigned error;} membuffer;unsigned membuffer_write(membuffer * buf,const void * ptr,unsigned bytes){	unsigned dest_size = buf->written + bytes;	if (buf->error) return 0;	if (dest_size > buf->allocated)	{		do		{			buf->allocated <<= 1;		} while(dest_size > buf->allocated);				{			void * newptr = realloc(buf->data,buf->allocated);			if (newptr==0)			{				free(buf->data);				buf->data = 0;				buf->error = 1;				return 0;			}			buf->data = newptr;		}	}	if (ptr) memcpy((char*)buf->data + buf->written,ptr,bytes);	buf->written += bytes;	return bytes;}#define membuffer_write_data membuffer_writeunsigned membuffer_write_int32(membuffer * buf,uint32_t data){	uint8_t temp[4] = {(uint8_t)(data>>24),(uint8_t)(data>>16),(uint8_t)(data>>8),(uint8_t)data};		return membuffer_write_data(buf,temp,4);}unsigned membuffer_write_int24(membuffer * buf,uint32_t data){	uint8_t temp[3] = {(uint8_t)(data>>16),(uint8_t)(data>>8),(uint8_t)data};	return membuffer_write_data(buf,temp,3);}unsigned membuffer_write_int16(membuffer * buf,uint16_t data){	uint8_t temp[2] = {(uint8_t)(data>>8),(uint8_t)data};	return membuffer_write_data(buf,temp,2);}unsigned membuffer_write_atom_name(membuffer * buf,const char * data){	return membuffer_write_data(buf,data,4)==4 ? 1 : 0;}void membuffer_write_atom(membuffer * buf,const char * name,unsigned size,const void * data){	membuffer_write_int32(buf,size + 8);	membuffer_write_atom_name(buf,name);	membuffer_write_data(buf,data,size);}unsigned membuffer_write_string(membuffer * buf,const char * data){	return membuffer_write_data(buf,data,strlen(data));}unsigned membuffer_write_int8(membuffer * buf,uint8_t data){	return membuffer_write_data(buf,&data,1);}void * membuffer_get_ptr(const membuffer * buf){	return buf->data;}unsigned membuffer_get_size(const membuffer * buf){	return buf->written;}unsigned membuffer_error(const membuffer * buf){	return buf->error;}void membuffer_set_error(membuffer * buf) {buf->error = 1;}unsigned membuffer_transfer_from_file(membuffer * buf,mp4ff_t * src,unsigned bytes){	unsigned oldsize;	void * bufptr;		oldsize = membuffer_get_size(buf);	if (membuffer_write_data(buf,0,bytes) != bytes) return 0;	bufptr = membuffer_get_ptr(buf);	if (bufptr==0) return 0;		if ((unsigned)mp4ff_read_data(src,(char*)bufptr + oldsize,bytes)!=bytes)	{		membuffer_set_error(buf);		return 0;	}		return bytes;}membuffer * membuffer_create(){	const unsigned initial_size = 256;	membuffer * buf = (membuffer *) malloc(sizeof(membuffer));	buf->data = malloc(initial_size);	buf->written = 0;	buf->allocated = initial_size;	buf->error = buf->data == 0 ? 1 : 0;	return buf;}void membuffer_free(membuffer * buf){	if (buf->data) free(buf->data);	free(buf);}void * membuffer_detach(membuffer * buf){	void * ret;	if (buf->error) return 0;	ret = realloc(buf->data,buf->written);		if (ret == 0) free(buf->data);	buf->data = 0;	buf->error = 1;		return ret;}#if 0/* metadata tag structure */typedef struct{    char *item;    char *value;} mp4ff_tag_t;/* metadata list structure */typedef struct{    mp4ff_tag_t *tags;    uint32_t count;} mp4ff_metadata_t;#endiftypedef struct{	const char * atom;	const char * name;	} stdmeta_entry;static stdmeta_entry stdmetas[] = {	{"﹏am","title"},	{"〢RT","artist"},	{"﹚rt","writer"},	{"゛lb","album"},	{"ヾay","date"},	{"﹖oo","tool"},	{"ヽmt","comment"},//	{"ゞen","genre"},	{"cpil","compilation"},//	{"trkn","track"},//	{"disk","disc"},//	{"gnre","genre"},	{"covr","cover"},};static const char* find_standard_meta(const char * name) //returns atom name if found, 0 if not{	unsigned n;	for(n=0;n<sizeof(stdmetas)/sizeof(stdmetas[0]);n++)	{		if (!stricmp(name,stdmetas[n].name)) return stdmetas[n].atom;	}    return 0;}static void membuffer_write_track_tag(membuffer * buf,const char * name,uint32_t index,uint32_t total){	membuffer_write_int32(buf,8 /*atom header*/ + 8 /*data atom header*/ + 8 /*flags + reserved*/ + 8 /*actual data*/ );	membuffer_write_atom_name(buf,name);	membuffer_write_int32(buf,8 /*data atom header*/ + 8 /*flags + reserved*/ + 8 /*actual data*/ );	membuffer_write_atom_name(buf,"data");	membuffer_write_int32(buf,0);//flags	membuffer_write_int32(buf,0);//reserved	membuffer_write_int16(buf,0);	membuffer_write_int16(buf,(uint16_t)index);//track number	membuffer_write_int16(buf,(uint16_t)total);//total tracks	membuffer_write_int16(buf,0);}static void membuffer_write_int16_tag(membuffer * buf,const char * name,uint16_t value){	membuffer_write_int32(buf,8 /*atom header*/ + 8 /*data atom header*/ + 8 /*flags + reserved*/ + 2 /*actual data*/ );	membuffer_write_atom_name(buf,name);	membuffer_write_int32(buf,8 /*data atom header*/ + 8 /*flags + reserved*/ + 2 /*actual data*/ );	membuffer_write_atom_name(buf,"data");	membuffer_write_int32(buf,0);//flags	membuffer_write_int32(buf,0);//reserved	membuffer_write_int16(buf,value);//value}static void membuffer_write_std_tag(membuffer * buf,const char * name,const char * value){	membuffer_write_int32(buf,8 /*atom header*/ + 8 /*data atom header*/ + 8 /*flags + reserved*/ + strlen(value) );	membuffer_write_atom_name(buf,name);	membuffer_write_int32(buf,8 /*data atom header*/ + 8 /*flags + reserved*/ + strlen(value));	membuffer_write_atom_name(buf,"data");	membuffer_write_int32(buf,1);//flags	membuffer_write_int32(buf,0);//reserved	membuffer_write_data(buf,value,strlen(value));}static void membuffer_write_custom_tag(membuffer * buf,const char * name,const char * value){	membuffer_write_int32(buf,8 /*atom header*/ + 0x1C /*weirdo itunes atom*/ + 12 /*name atom header*/ + strlen(name) + 16 /*data atom header + flags*/ + strlen(value) );	membuffer_write_atom_name(buf,"----");	membuffer_write_int32(buf,0x1C);//weirdo itunes atom	membuffer_write_atom_name(buf,"mean");	membuffer_write_int32(buf,0);	membuffer_write_data(buf,"com.apple.iTunes",16);	membuffer_write_int32(buf,12 + strlen(name));	membuffer_write_atom_name(buf,"name");	membuffer_write_int32(buf,0);	membuffer_write_data(buf,name,strlen(name));	membuffer_write_int32(buf,8 /*data atom header*/ + 8 /*flags + reserved*/ + strlen(value));	membuffer_write_atom_name(buf,"data");	membuffer_write_int32(buf,1);//flags	membuffer_write_int32(buf,0);//reserved	membuffer_write_data(buf,value,strlen(value));}static uint32_t myatoi(const char * param){	return param ? atoi(param) : 0;}static uint32_t create_ilst(const mp4ff_metadata_t * data,void ** out_buffer,uint32_t * out_size){	membuffer * buf = membuffer_create();	unsigned metaptr;	char * mask = (char*)malloc(data->count);	memset(mask,0,data->count);	{		const char * tracknumber_ptr = 0, * totaltracks_ptr = 0;		const char * discnumber_ptr = 0, * totaldiscs_ptr = 0;		const char * genre_ptr = 0, * tempo_ptr = 0;		for(metaptr = 0; metaptr < data->count; metaptr++)		{			mp4ff_tag_t * tag = &data->tags[metaptr];			if (!stricmp(tag->item,"tracknumber") || !stricmp(tag->item,"track"))			{				if (tracknumber_ptr==0) tracknumber_ptr = tag->value;				mask[metaptr] = 1;			}			else if (!stricmp(tag->item,"totaltracks"))			{				if (totaltracks_ptr==0) totaltracks_ptr = tag->value;

⌨️ 快捷键说明

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