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

📄 mpeg3title.c

📁 网络MPEG4IP流媒体开发源代码
💻 C
字号:
#include "mpeg3private.h"#include "mpeg3protos.h"#include "mpeg3title.h"#include <stdlib.h>mpeg3_title_t* mpeg3_new_title(mpeg3_t *file, const char *path){	mpeg3_title_t *title = calloc(1, sizeof(mpeg3_title_t));	title->fs = mpeg3_new_fs(path);	title->file = file;	return title;}int mpeg3_delete_title(mpeg3_title_t *title){	mpeg3_delete_fs(title->fs);	if(title->timecode_table_size)	{		free(title->timecode_table);	}	free(title);	return 0;}int mpeg3_copy_title(mpeg3_title_t *dst, mpeg3_title_t *src){	int i;	mpeg3_copy_fs(dst->fs, src->fs);	dst->total_bytes = src->total_bytes;	if(src->timecode_table_size)	{		dst->timecode_table_allocation = src->timecode_table_allocation;		dst->timecode_table_size = src->timecode_table_size;		dst->timecode_table = calloc(1, sizeof(mpeg3demux_timecode_t) * dst->timecode_table_allocation);		for(i = 0; i < dst->timecode_table_size; i++)		{			dst->timecode_table[i] = src->timecode_table[i];		}	}	return 0;}int mpeg3_dump_title(mpeg3_title_t *title){	int i;		printf("mpeg3_dump_title path %s timecode_table_size %d\n", title->fs->path, title->timecode_table_size);	for(i = 0; i < title->timecode_table_size; i++)	{		printf("%.02f: %x - %x %.02f %.02f %x\n", 			title->timecode_table[i].absolute_start_time, 			title->timecode_table[i].start_byte, 			title->timecode_table[i].end_byte, 			title->timecode_table[i].start_time, 			title->timecode_table[i].end_time, 			title->timecode_table[i].program);	}	return 0;}// Realloc doesn't work for some reason.static void extend_timecode_table(mpeg3_title_t *title){	if(!title->timecode_table || 		title->timecode_table_allocation <= title->timecode_table_size)	{		long new_allocation;		mpeg3demux_timecode_t *new_table;		int i;//printf("extend_timecode_table 1\n");		new_allocation = title->timecode_table_allocation ? 			title->timecode_table_size * 2 : 			64;		new_table = calloc(1, sizeof(mpeg3demux_timecode_t) * new_allocation);//printf("extend_timecode_table 1\n");		memcpy(new_table, 			title->timecode_table, 			sizeof(mpeg3demux_timecode_t) * title->timecode_table_allocation);//printf("extend_timecode_table 1 %p %d %d\n", title->timecode_table, title->timecode_table_allocation,//	(new_allocation - title->timecode_table_allocation));		free(title->timecode_table);		title->timecode_table = new_table;//printf("extend_timecode_table 2\n");		title->timecode_table_allocation = new_allocation;//printf("extend_timecode_table 2\n");	}}void mpeg3_new_timecode(mpeg3_title_t *title, 		long start_byte, 		double start_time,		long end_byte,		double end_time,		int program){	mpeg3demux_timecode_t *new_timecode;	extend_timecode_table(title);	new_timecode = &title->timecode_table[title->timecode_table_size];		new_timecode->start_byte = start_byte;	new_timecode->start_time = start_time;	new_timecode->end_byte = end_byte;	new_timecode->end_time = end_time;	new_timecode->absolute_start_time = 0;	new_timecode->program = program;	title->timecode_table_size++;}mpeg3demux_timecode_t* mpeg3_append_timecode(mpeg3_demuxer_t *demuxer, 		mpeg3_title_t *title, 		long prev_byte, 		double prev_time, 		long start_byte, 		double start_time,		int dont_store,		int program){	mpeg3demux_timecode_t *new_timecode, *old_timecode;	long i;	extend_timecode_table(title);/* * printf("mpeg3_append_timecode 1 %d %f %d %f %d %d\n", prev_byte,  * 		prev_time,  * 		start_byte,  * 		start_time, * 		dont_store, * 		program); */	new_timecode = &title->timecode_table[title->timecode_table_size];	if(!dont_store)	{		new_timecode->start_byte = start_byte;		new_timecode->start_time = start_time;		new_timecode->absolute_start_time = 0;		if(title->timecode_table_size > 0)		{			old_timecode = &title->timecode_table[title->timecode_table_size - 1];			old_timecode->end_byte = prev_byte;			old_timecode->end_time = prev_time;			new_timecode->absolute_start_time = 				prev_time - 				old_timecode->start_time + 				old_timecode->absolute_start_time;			new_timecode->absolute_end_time = start_time;		}	}	title->timecode_table_size++;	return new_timecode;}/* Create a title. *//* Build a table of timecodes contained in the program stream. *//* If toc is 0 just read the first and last timecode. */int mpeg3demux_create_title(mpeg3_demuxer_t *demuxer, 		int timecode_search, 		FILE *toc){	int result = 0, done = 0, counter_start, counter;	mpeg3_t *file = demuxer->file;	long next_byte, prev_byte;	double next_time, prev_time, absolute_time;	long i;	mpeg3_title_t *title;	uint32_t test_header = 0;	mpeg3demux_timecode_t *timecode = 0;	demuxer->error_flag = 0;	demuxer->read_all = 1;/* Create a single title */	if(!demuxer->total_titles)	{		demuxer->titles[0] = mpeg3_new_title(file, file->fs->path);		demuxer->total_titles = 1;		mpeg3demux_open_title(demuxer, 0);	}	title = demuxer->titles[0];	title->total_bytes = mpeg3io_total_bytes(title->fs);/* Get timecodes for the title */	if(file->is_transport_stream || file->is_program_stream)	{		mpeg3io_seek(title->fs, 0);//fprintf(stderr, "mpeg3demux_create_title: 0 %f %d %d\n", demuxer->time, result, mpeg3io_eof(title->fs));		while(!done && !result && !mpeg3io_eof(title->fs))		{			next_byte = mpeg3io_tell(title->fs);			result = mpeg3_read_next_packet(demuxer);//printf("mpeg3demux_create_title: 1 %f %d\n", demuxer->time, result);			if(!result)			{				next_time = demuxer->time;//printf("timecode: %f %f %f\n", (double)next_time, (double)prev_time, (double)demuxer->time);				if(next_time < prev_time || 					next_time - prev_time > MPEG3_CONTIGUOUS_THRESHOLD ||					!title->timecode_table_size)				{/* Discontinuous */					timecode = mpeg3_append_timecode(demuxer, 						title, 						prev_byte, 						prev_time, 						next_byte, 						next_time,						0,						0);/* * printf("timecode: %ld %ld %f %f\n", * 				timecode->start_byte, * 				timecode->end_byte, * 				timecode->start_time, * 				timecode->end_time); */					counter_start = next_time;				}				// Breaks transport stream decoding	// Kai Strieder//				if (prev_time == next_time)//				{//					done = 1;//				}				prev_time = next_time;				prev_byte = next_byte;				counter = next_time;			}/* Just get the first bytes if not building a toc to get the stream ID's. */			if(next_byte > 0x100000 && 				(!timecode_search || !toc)) done = 1;//printf("mpeg3demux_create_title 2 next_byte=%d next_time=%f done=%d result=%d %d\n", //	next_byte, next_time, done, result, mpeg3io_eof(title->fs));		}/* Get the last timecode */		if(!toc || !timecode_search)		{			demuxer->read_all = 0;			result = mpeg3io_seek(title->fs, title->total_bytes);//			result = mpeg3io_seek(title->fs, title->total_bytes - //				(title->total_bytes % demuxer->packet_size));//printf("mpeg3demux_create_title 3 %d\n", result);			if(!result) result = mpeg3_read_prev_packet(demuxer);		}//fprintf(stderr, "mpeg3demux_create_title 4 %d %f\n", result, demuxer->time);		if(title->timecode_table && timecode)		{			timecode->end_byte = title->total_bytes;//			timecode->end_byte = mpeg3io_tell(title->fs)/*  + demuxer->packet_size */;			timecode->end_time = demuxer->time;			timecode->absolute_end_time = timecode->end_time - timecode->start_time;		}	}//fprintf(stderr, "mpeg3demux_create_title 5 %d\n", result);	mpeg3io_seek(title->fs, 0);	demuxer->read_all = 0;	return 0;}int mpeg3demux_print_timecodes(mpeg3_title_t *title, FILE *output){	mpeg3demux_timecode_t *timecode;	mpeg3_t *file = title->file;	int i;	if(title->timecode_table)	{		for(i = 0; i < title->timecode_table_size; i++)		{			timecode = &title->timecode_table[i];			fprintf(output, "REGION: %ld %ld %f %f %d\n",				timecode->start_byte,				timecode->end_byte,				timecode->start_time,				timecode->end_time,				timecode->program);		}	}	return 0;}int mpeg3demux_print_streams(mpeg3_demuxer_t *demuxer, FILE *toc){	int i;/* Print the stream information */	for(i = 0; i < MPEG3_MAX_STREAMS; i++)	{		if(demuxer->astream_table[i])			fprintf(toc, "ASTREAM: %d %d\n", i, demuxer->astream_table[i]);		if(demuxer->vstream_table[i])			fprintf(toc, "VSTREAM: %d %d\n", i, demuxer->vstream_table[i]);	}	return 0;}

⌨️ 快捷键说明

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