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

📄 mp4atom.c

📁 mpeg4 video codec mpeg4 video codec
💻 C
📖 第 1 页 / 共 2 页
字号:
    } else if (atom_type == ATOM_MP4V) {        f->track[f->total_tracks - 1]->type = TRACK_VIDEO;    } else if (atom_type == ATOM_MP4S) {        f->track[f->total_tracks - 1]->type = TRACK_SYSTEM;    } else {        f->track[f->total_tracks - 1]->type = TRACK_UNKNOWN;    }    return 0;}static int32_t mp4ff_read_name(mp4ff_t *f, uint64_t size){    uint8_t *data = malloc(size);    mp4ff_read_data(f, data, size);    if (f->track[f->total_tracks - 1]->p_drms != NULL)    {        drms_init(f->track[f->total_tracks - 1]->p_drms,            DRMS_INIT_NAME, data, strlen(data) );    }    if (data)        free(data);    return 0;}static int32_t mp4ff_read_priv(mp4ff_t *f, uint64_t size){    uint8_t *data = malloc(size);    mp4ff_read_data(f, data, size);    if (f->track[f->total_tracks - 1]->p_drms != 0)    {        drms_init(f->track[f->total_tracks - 1]->p_drms,            DRMS_INIT_PRIV, data, size );    }    if (data)        free(data);    return 0;}static int32_t mp4ff_read_iviv(mp4ff_t *f, uint64_t size){    uint8_t *data = malloc(size);    mp4ff_read_data(f, data, size);    if (f->track[f->total_tracks - 1]->p_drms != 0)    {        drms_init(f->track[f->total_tracks - 1]->p_drms,            DRMS_INIT_IVIV, data, sizeof(uint32_t) * 4 );    }    if (data)        free(data);    return 0;}#endifstatic int32_t mp4ff_read_stsd(mp4ff_t *f){    int32_t i;    uint8_t header_size = 0;    mp4ff_read_char(f); /* version */    mp4ff_read_int24(f); /* flags */    f->track[f->total_tracks - 1]->stsd_entry_count = mp4ff_read_int32(f);    for (i = 0; i < f->track[f->total_tracks - 1]->stsd_entry_count; i++)    {        uint64_t skip = mp4ff_position(f);        uint64_t size;        uint8_t atom_type = 0;        size = mp4ff_atom_read_header(f, &atom_type, &header_size);        skip += size;        if (atom_type == ATOM_MP4A)        {            f->track[f->total_tracks - 1]->type = TRACK_AUDIO;            mp4ff_read_mp4a(f);        } else if (atom_type == ATOM_MP4V) {            f->track[f->total_tracks - 1]->type = TRACK_VIDEO;        } else if (atom_type == ATOM_MP4S) {            f->track[f->total_tracks - 1]->type = TRACK_SYSTEM;#ifdef ITUNES_DRM        } else if (atom_type == ATOM_DRMS) {            // track type is read from the "frma" atom            f->track[f->total_tracks - 1]->type = TRACK_UNKNOWN;            mp4ff_read_drms(f, skip-size+header_size);#endif        } else {            f->track[f->total_tracks - 1]->type = TRACK_UNKNOWN;        }        mp4ff_set_position(f, skip);    }    return 0;}static int32_t mp4ff_read_stsc(mp4ff_t *f){    int32_t i;    mp4ff_read_char(f); /* version */     mp4ff_read_int24(f); /* flags */     f->track[f->total_tracks - 1]->stsc_entry_count = mp4ff_read_int32(f);    f->track[f->total_tracks - 1]->stsc_first_chunk =        (int32_t*)malloc(f->track[f->total_tracks - 1]->stsc_entry_count*sizeof(int32_t));    f->track[f->total_tracks - 1]->stsc_samples_per_chunk =        (int32_t*)malloc(f->track[f->total_tracks - 1]->stsc_entry_count*sizeof(int32_t));    f->track[f->total_tracks - 1]->stsc_sample_desc_index =        (int32_t*)malloc(f->track[f->total_tracks - 1]->stsc_entry_count*sizeof(int32_t));    for (i = 0; i < f->track[f->total_tracks - 1]->stsc_entry_count; i++)    {        f->track[f->total_tracks - 1]->stsc_first_chunk[i] = mp4ff_read_int32(f);        f->track[f->total_tracks - 1]->stsc_samples_per_chunk[i] = mp4ff_read_int32(f);        f->track[f->total_tracks - 1]->stsc_sample_desc_index[i] = mp4ff_read_int32(f);    }    return 0;}static int32_t mp4ff_read_stco(mp4ff_t *f){    int32_t i;    mp4ff_read_char(f); /* version */    mp4ff_read_int24(f); /* flags */    f->track[f->total_tracks - 1]->stco_entry_count = mp4ff_read_int32(f);    f->track[f->total_tracks - 1]->stco_chunk_offset =        (int32_t*)malloc(f->track[f->total_tracks - 1]->stco_entry_count*sizeof(int32_t));    for (i = 0; i < f->track[f->total_tracks - 1]->stco_entry_count; i++)    {        f->track[f->total_tracks - 1]->stco_chunk_offset[i] = mp4ff_read_int32(f);    }    return 0;}static int32_t mp4ff_read_ctts(mp4ff_t *f){    int32_t i;	mp4ff_track_t * p_track = f->track[f->total_tracks - 1];	if (p_track->ctts_entry_count) return 0;    mp4ff_read_char(f); /* version */    mp4ff_read_int24(f); /* flags */    p_track->ctts_entry_count = mp4ff_read_int32(f);    p_track->ctts_sample_count = (int32_t*)malloc(p_track->ctts_entry_count * sizeof(int32_t));    p_track->ctts_sample_offset = (int32_t*)malloc(p_track->ctts_entry_count * sizeof(int32_t));	if (p_track->ctts_sample_count == 0 || p_track->ctts_sample_offset == 0)	{		if (p_track->ctts_sample_count) {free(p_track->ctts_sample_count);p_track->ctts_sample_count=0;}		if (p_track->ctts_sample_offset) {free(p_track->ctts_sample_offset);p_track->ctts_sample_offset=0;}		p_track->ctts_entry_count = 0;		return 0;	}	else	{		for (i = 0; i < f->track[f->total_tracks - 1]->ctts_entry_count; i++)		{			p_track->ctts_sample_count[i] = mp4ff_read_int32(f);			p_track->ctts_sample_offset[i] = mp4ff_read_int32(f);		}		return 1;	}}static int32_t mp4ff_read_stts(mp4ff_t *f){    int32_t i;	mp4ff_track_t * p_track = f->track[f->total_tracks - 1];	if (p_track->stts_entry_count) return 0;    mp4ff_read_char(f); /* version */    mp4ff_read_int24(f); /* flags */    p_track->stts_entry_count = mp4ff_read_int32(f);    p_track->stts_sample_count = (int32_t*)malloc(p_track->stts_entry_count * sizeof(int32_t));    p_track->stts_sample_delta = (int32_t*)malloc(p_track->stts_entry_count * sizeof(int32_t));		if (p_track->stts_sample_count == 0 || p_track->stts_sample_delta == 0)	{		if (p_track->stts_sample_count) {free(p_track->stts_sample_count);p_track->stts_sample_count=0;}		if (p_track->stts_sample_delta) {free(p_track->stts_sample_delta);p_track->stts_sample_delta=0;}		p_track->stts_entry_count = 0;		return 0;	}	else	{		for (i = 0; i < f->track[f->total_tracks - 1]->stts_entry_count; i++)		{			p_track->stts_sample_count[i] = mp4ff_read_int32(f);			p_track->stts_sample_delta[i] = mp4ff_read_int32(f);		}		return 1;	}}static int32_t mp4ff_read_mvhd(mp4ff_t *f){    int32_t i;    mp4ff_read_char(f); /* version */    mp4ff_read_int24(f); /* flags */    /* creation_time */ mp4ff_read_int32(f);    /* modification_time */ mp4ff_read_int32(f);    f->time_scale = mp4ff_read_int32(f);    f->duration = mp4ff_read_int32(f);    /* preferred_rate */ mp4ff_read_int32(f); /*mp4ff_read_fixed32(f);*/    /* preferred_volume */ mp4ff_read_int16(f); /*mp4ff_read_fixed16(f);*/    for (i = 0; i < 10; i++)    {        /* reserved */ mp4ff_read_char(f);    }    for (i = 0; i < 9; i++)    {        mp4ff_read_int32(f); /* matrix */    }    /* preview_time */ mp4ff_read_int32(f);    /* preview_duration */ mp4ff_read_int32(f);    /* poster_time */ mp4ff_read_int32(f);    /* selection_time */ mp4ff_read_int32(f);    /* selection_duration */ mp4ff_read_int32(f);    /* current_time */ mp4ff_read_int32(f);    /* next_track_id */ mp4ff_read_int32(f);    return 0;}#if 0static int32_t mp4ff_read_tkhd(mp4ff_t *f){	uint8_t version;	uint32_t flags;    version = mp4ff_read_char(f); /* version */    flags = mp4ff_read_int24(f); /* flags */	if (version==1)	{		mp4ff_read_int64(f);//creation-time		mp4ff_read_int64(f);//modification-time		mp4ff_read_int32(f);//track-id		mp4ff_read_int32(f);//reserved		f->track[f->total_tracks - 1]->duration = mp4ff_read_int64(f);//duration	}	else //version == 0	{		mp4ff_read_int32(f);//creation-time		mp4ff_read_int32(f);//modification-time		mp4ff_read_int32(f);//track-id		mp4ff_read_int32(f);//reserved		f->track[f->total_tracks - 1]->duration = mp4ff_read_int32(f);//duration		if (f->track[f->total_tracks - 1]->duration == 0xFFFFFFFF)			f->track[f->total_tracks - 1]->duration = 0xFFFFFFFFFFFFFFFF;	}	mp4ff_read_int32(f);//reserved	mp4ff_read_int32(f);//reserved	mp4ff_read_int16(f);//layer	mp4ff_read_int16(f);//pre-defined	mp4ff_read_int16(f);//volume	mp4ff_read_int16(f);//reserved		//matrix	mp4ff_read_int32(f); mp4ff_read_int32(f); mp4ff_read_int32(f);	mp4ff_read_int32(f); mp4ff_read_int32(f); mp4ff_read_int32(f);	mp4ff_read_int32(f); mp4ff_read_int32(f); mp4ff_read_int32(f);	mp4ff_read_int32(f);//width	mp4ff_read_int32(f);//height	return 1;}#endifstatic int32_t mp4ff_read_mdhd(mp4ff_t *f){	uint32_t version;	version = mp4ff_read_int32(f);	if (version==1)	{		mp4ff_read_int64(f);//creation-time		mp4ff_read_int64(f);//modification-time		f->track[f->total_tracks - 1]->timeScale = mp4ff_read_int32(f);//timescale		f->track[f->total_tracks - 1]->duration = mp4ff_read_int64(f);//duration	}	else //version == 0	{		uint32_t temp;		mp4ff_read_int32(f);//creation-time		mp4ff_read_int32(f);//modification-time		f->track[f->total_tracks - 1]->timeScale = mp4ff_read_int32(f);//timescale		temp = mp4ff_read_int32(f);		f->track[f->total_tracks - 1]->duration = (temp == (uint32_t)(-1)) ? (uint64_t)(-1) : (uint64_t)(temp);	}	mp4ff_read_int16(f);	mp4ff_read_int16(f);	return 1;}#ifdef USE_TAGGINGstatic int32_t mp4ff_read_meta(mp4ff_t *f, const uint64_t size){    uint64_t subsize, sumsize = 0;    uint8_t atom_type;    uint8_t header_size = 0;    mp4ff_read_char(f); /* version */    mp4ff_read_int24(f); /* flags */    while (sumsize < (size-12))    {        subsize = mp4ff_atom_read_header(f, &atom_type, &header_size);        if (atom_type == ATOM_ILST)        {            mp4ff_parse_metadata(f, (uint32_t)(subsize-(header_size+4)));        } else {            mp4ff_set_position(f, mp4ff_position(f)+subsize-header_size);        }        sumsize += subsize;    }    return 0;}#endifint32_t mp4ff_atom_read(mp4ff_t *f, const int32_t size, const uint8_t atom_type){	uint64_t dest_position = mp4ff_position(f)+size-8;    if (atom_type == ATOM_STSZ)    {        /* sample size box */        mp4ff_read_stsz(f);    } else if (atom_type == ATOM_STTS) {        /* time to sample box */        mp4ff_read_stts(f);	} else if (atom_type == ATOM_CTTS) {		/* composition offset box */		mp4ff_read_ctts(f);    } else if (atom_type == ATOM_STSC) {        /* sample to chunk box */        mp4ff_read_stsc(f);    } else if (atom_type == ATOM_STCO) {        /* chunk offset box */        mp4ff_read_stco(f);    } else if (atom_type == ATOM_STSD) {        /* sample description box */        mp4ff_read_stsd(f);    } else if (atom_type == ATOM_MVHD) {        /* movie header box */        mp4ff_read_mvhd(f);    } else if (atom_type == ATOM_MDHD) {        /* track header */        mp4ff_read_mdhd(f);#ifdef ITUNES_DRM    } else if (atom_type == ATOM_FRMA) {        /* DRM track format */        mp4ff_read_frma(f);    } else if (atom_type == ATOM_IVIV) {        mp4ff_read_iviv(f, size-8);    } else if (atom_type == ATOM_NAME) {        mp4ff_read_name(f, size-8);    } else if (atom_type == ATOM_PRIV) {        mp4ff_read_priv(f, size-8);#endif#ifdef USE_TAGGING    } else if (atom_type == ATOM_META) {        /* iTunes Metadata box */        mp4ff_read_meta(f, size);#endif    }         mp4ff_set_position(f, dest_position);    return 0;}

⌨️ 快捷键说明

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