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

📄 real_rmff.c

📁 vlc源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (C) 2002-2003 the xine project * * This file is part of xine, a free video player. * * xine is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * xine is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA * * $Id: 73dc65580715bd8f5b68394f4527ef6bc5a695d4 $ * * functions for real media file format * adopted from joschkas real tools */#include "real.h"#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])/* * writes header data to a buffer */static int rmff_dump_fileheader(rmff_fileheader_t *fileheader, uint8_t *buffer, int bufsize) {    if (!fileheader) return 0;    if (bufsize < RMFF_FILEHEADER_SIZE)        return -1;    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);    return RMFF_FILEHEADER_SIZE;}static int rmff_dump_prop(rmff_prop_t *prop, uint8_t *buffer, int bufsize) {    if (!prop) return 0;        if (bufsize < RMFF_PROPHEADER_SIZE)        return -1;    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, 8);    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);    return RMFF_PROPHEADER_SIZE;}static int rmff_dump_mdpr(rmff_mdpr_t *mdpr, uint8_t *buffer, int bufsize) {    int s1, s2, s3;    if (!mdpr) return 0;    if (bufsize < RMFF_MDPRHEADER_SIZE + mdpr->type_specific_len +            mdpr->stream_name_size + mdpr->mime_type_size)    return -1;    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=mdpr->stream_name_size;    memcpy(&buffer[41], mdpr->stream_name, s1);    memcpy(&buffer[41+s1], &mdpr->mime_type_size, 1);    s2=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=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);    return RMFF_MDPRHEADER_SIZE + s1 + s2 + s3;}static int rmff_dump_cont(rmff_cont_t *cont, uint8_t *buffer, int bufsize) {    int p;    if (!cont) return 0;        if (bufsize < RMFF_CONTHEADER_SIZE + cont->title_len + cont->author_len + \            cont->copyright_len + cont->comment_len)        return -1;    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);    return RMFF_CONTHEADER_SIZE + cont->title_len + cont->author_len + \        cont->copyright_len + cont->comment_len;}static int rmff_dump_dataheader(rmff_data_t *data, uint8_t *buffer, int bufsize) {  if (!data) return 0;    if (bufsize < RMFF_DATAHEADER_SIZE)      return -1;  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);  return RMFF_DATAHEADER_SIZE;}int rmff_dump_header(rmff_header_t *h, void *buf_gen, int max) {    uint8_t *buffer = buf_gen;    int written=0, size;    rmff_mdpr_t **stream=h->streams;    if ((size=rmff_dump_fileheader(h->fileheader, &buffer[written], max)) < 0)        return -1;        written += size;    max -= size;    if ((size=rmff_dump_prop(h->prop, &buffer[written], max)) < 0)        return -1;        written += size;    max -= size;    if ((size=rmff_dump_cont(h->cont, &buffer[written], max)) < 0)        return -1;    written += size;    max -= size;    if (stream) {        while(*stream) {            if ((size=rmff_dump_mdpr(*stream, &buffer[written], max)) < 0)                return -1;            written += size;            max -= size;            stream++;        }    }    if ((size=rmff_dump_dataheader(h->data, &buffer[written], max)) < 0)        return -1;        written+=size;    return written;}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;}rmff_fileheader_t *rmff_new_fileheader(uint32_t num_headers) {  rmff_fileheader_t *fileheader = malloc(sizeof(rmff_fileheader_t));  if( !fileheader ) return NULL;  memset(fileheader, 0, sizeof(rmff_fileheader_t));  fileheader->object_id=RMF_TAG;  fileheader->size=18;  fileheader->object_version=0;  fileheader->file_version=0;  fileheader->num_headers=num_headers;  return fileheader;}rmff_prop_t *rmff_new_prop (  uint32_t max_bit_rate,  uint32_t avg_bit_rate,  uint32_t max_packet_size,  uint32_t avg_packet_size,  uint32_t num_packets,  uint32_t duration,  uint32_t preroll,  uint32_t index_offset,  uint32_t data_offset,

⌨️ 快捷键说明

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