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

📄 rmff.c

📁 linux下流媒体下载程序代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*********************************************************************** *    rmff.c: for using rmff header (real media file format) *********************************************************************** * Copyright (C) 2007 metro <me_t_ro@yahoo.com> * * This file is part of msdl, media stream downloader * * This file is mainly(totally) based on rmff.c in xine-lib, * and include code from xine. * * * This program 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. * * This program 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., * 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. * ***********************************************************************/ /* * Copyright notice of MPlayer project * which some part of msdl is based on. * (from MPlayer-1.0rc2/stream/realrtsp/rmff.c) *//* * This file was ported to MPlayer from xine CVS rmff.c,v 1.3 2002/12/24 01:30:22 *//* * Copyright (C) 2002 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 * * * functions for real media file format * adopted from joschkas real tools */#include <stdio.h>#include <stdlib.h>#include <string.h>#include "msdl.h"#include "msdllib.h"#include "display.h"#include "rmff.h"struct rmff_header_t *new_rmff_header_t(void){    struct rmff_header_t *p = (struct rmff_header_t *)xmalloc(sizeof(struct rmff_header_t));    return p;}/* * writes header data to a buffer */static void rmff_dump_fileheader(struct rmff_fileheader_t *fileheader,				 uint8_t *buffer){    if (!fileheader) return;      put32_be(buffer,     fileheader->object_id);    put32_be(buffer + 4, fileheader->size);    put16_be(buffer + 8, fileheader->object_version);    put32_be(buffer + 10,fileheader->file_version);    put32_be(buffer + 14,fileheader->num_headers);}static void rmff_dump_prop(struct rmff_prop_t *prop,uint8_t *buffer){    if (!prop) return;      put32_be(buffer,     prop->object_id);    put32_be(buffer + 4, prop->size);    put16_be(buffer + 8, prop->object_version);    put32_be(buffer + 10,prop->max_bit_rate);    put32_be(buffer + 14,prop->avg_bit_rate);    put32_be(buffer + 18,prop->max_packet_size);    put32_be(buffer + 22,prop->avg_packet_size);    put32_be(buffer + 26,prop->num_packets);    put32_be(buffer + 30,prop->duration);    put32_be(buffer + 34,prop->preroll);    put32_be(buffer + 38,prop->index_offset);    put32_be(buffer + 42,prop->data_offset);    put16_be(buffer + 46,prop->num_streams);      put16_be(buffer + 48,prop->flags);}static void rmff_dump_mdpr(struct rmff_mdpr_t *mdpr,uint8_t *buffer){    int s1, s2, s3;    if (!mdpr) return;      put32_be(buffer,mdpr->object_id);    put32_be(buffer + 4,mdpr->size);    put16_be(buffer + 8,mdpr->object_version);    put16_be(buffer + 10,mdpr->stream_number);    put32_be(buffer + 12,mdpr->max_bit_rate);    put32_be(buffer + 16,mdpr->avg_bit_rate);    put32_be(buffer + 20,mdpr->max_packet_size);    put32_be(buffer + 24,mdpr->avg_packet_size);    put32_be(buffer + 28,mdpr->start_time);    put32_be(buffer + 32,mdpr->preroll);    put32_be(buffer + 36,mdpr->duration);    put8(buffer + 40,mdpr->stream_name_size);    s1 = mdpr->stream_name_size;    memcpy(buffer + 41,mdpr->stream_name,s1);      put8(buffer + 41 + s1,mdpr->mime_type_size);    s2 = mdpr->mime_type_size;    memcpy(buffer + 42 + s1,mdpr->mime_type,s2);      put32_be(buffer + 42 + s1 + s2,mdpr->type_specific_len);    s3 = mdpr->type_specific_len;    memcpy(buffer + 46 + s1 + s2,mdpr->type_specific_data,s3);}static void rmff_dump_cont(struct rmff_cont_t *cont,uint8_t *buffer){    int s1,s2,s3,s4;    if (!cont) return;      put32_be(buffer,cont->object_id);    put32_be(buffer + 4,cont->size);    put16_be(buffer + 8,cont->object_version);      put16_be(buffer + 10,cont->title_len);    s1 = cont->title_len;    memcpy(buffer + 12,cont->title,s1);      put16_be(buffer + 12 + s1,cont->author_len);    s2 = cont->author_len;    memcpy(buffer + 14 + s1,cont->author,s2);      put16_be(buffer + 14 + s1 + s2,cont->copyright_len);    s3 = cont->copyright_len;    memcpy(buffer + 16 + s1 + s2,cont->copyright,s3);      put16_be(buffer + 16 + s1 + s2 + s3,cont->comment_len);    s4 = cont->comment_len;    memcpy(buffer + 18 + s1 + s2,cont->comment,s4);}static void rmff_dump_dataheader(struct rmff_data_t *data,uint8_t *buffer){    if (!data) return;    put32_be(buffer,data->object_id);    put32_be(buffer + 4,data->size);    put16_be(buffer + 8,data->object_version);    put32_be(buffer + 10,data->num_packets);    put32_be(buffer + 14,data->next_data_header);}int rmff_dump_header(struct rmff_header_t *h,uint8_t *buffer){    int written=0;    struct 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;    return written;}/* * format ph to buffer to valid data structure for file */void rmff_dump_pheader(struct rmff_pheader_t *ph,uint8_t *data){    data[0] = (ph->object_version>>8) & 0xff;    data[1] = (ph->object_version)    & 0xff;    data[2] = (ph->length >> 8)       & 0xff;    data[3] = (ph->length)            & 0xff;    data[4] = (ph->stream_number>>8)  & 0xff;    data[5] = (ph->stream_number)     & 0xff;    data[6] = (ph->timestamp>>24)     & 0xff;    data[7] = (ph->timestamp>>16)     & 0xff;    data[8] = (ph->timestamp>>8)      & 0xff;    data[9] = (ph->timestamp)         & 0xff;    data[10] = ph->reserved;    data[11] = ph->flags;}int rmff_read_pheader(uint8_t *data,struct rmff_pheader_t *ph){    ph->object_version = get16_be(data);    ph->length         = get16_be(data + 2);    ph->stream_number  = get16_be(data + 4);    ph->timestamp      = get32_be(data + 6);    ph->reserved       = get8(data + 10);    ph->flags          = get8(data + 11);        return ph->length;}struct rmff_fileheader_t *new_rmff_fileheader(uint32_t num_headers){    struct rmff_fileheader_t *fileheader = xmalloc(sizeof(struct 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;}struct rmff_prop_t *new_rmff_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,				   uint16_t num_streams,				   uint16_t flags ){    struct rmff_prop_t *prop = xmalloc(sizeof(struct rmff_prop_t));    prop->object_id=PROP_TAG;    prop->size=50;    prop->object_version=0;    prop->max_bit_rate=max_bit_rate;    prop->avg_bit_rate=avg_bit_rate;    prop->max_packet_size=max_packet_size;    prop->avg_packet_size=avg_packet_size;    prop->num_packets=num_packets;    prop->duration=duration;    prop->preroll=preroll;    prop->index_offset=index_offset;    prop->data_offset=data_offset;    prop->num_streams=num_streams;    prop->flags=flags;       return prop;}struct rmff_mdpr_t *new_rmff_mdpr(uint16_t   stream_number,				  uint32_t   max_bit_rate,				  uint32_t   avg_bit_rate,				  uint32_t   max_packet_size,				  uint32_t   avg_packet_size,				  uint32_t   start_time,				  uint32_t   preroll,				  uint32_t   duration,				  const char *stream_name,				  const char *mime_type,				  uint32_t   type_specific_len,				  const uint8_t *type_specific_data ){      struct rmff_mdpr_t *mdpr = xmalloc(sizeof(struct rmff_mdpr_t));      mdpr->object_id=MDPR_TAG;    mdpr->object_version=0;    mdpr->stream_number=stream_number;    mdpr->max_bit_rate=max_bit_rate;    mdpr->avg_bit_rate=avg_bit_rate;    mdpr->max_packet_size=max_packet_size;    mdpr->avg_packet_size=avg_packet_size;    mdpr->start_time=start_time;    mdpr->preroll=preroll;    mdpr->duration=duration;    mdpr->stream_name_size=0;    if (stream_name) {	mdpr->stream_name=strdup(stream_name);	mdpr->stream_name_size=strlen(stream_name);    }

⌨️ 快捷键说明

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