📄 mp42ts.c
字号:
/* * GPAC - Multimedia Framework C SDK * * Copyright (c) ENST 2000-200X * All rights reserved * * This file is part of GPAC / mp42ts application * * GPAC is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * GPAC 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * */#include <gpac/isomedia.h>#include <gpac/bifs.h>#include <gpac/mpegts.h>#include <gpac/avparse.h>#include "mp42ts.h"#if 0/************************************************************ * SL-Packetized Stream related functions ************************************************************/void config_sample_hdr(M2TS_mux_stream *stream){ GF_SAFEALLOC(stream->SLHeader, GF_SLHeader); if (stream->sample){ stream->SLHeader->accessUnitStartFlag = 1; stream->SLHeader->accessUnitEndFlag = 1; stream->SLHeader->accessUnitLength = stream->sample->dataLength; stream->SLHeader->randomAccessPointFlag = stream->sample->IsRAP; stream->SLHeader->compositionTimeStampFlag = 1; stream->SLHeader->compositionTimeStamp = (stream->sample->CTS_Offset+stream->sample->DTS)*90000/1000; stream->SLHeader->decodingTimeStampFlag = 1; stream->SLHeader->decodingTimeStamp = stream->sample->DTS*90000/1000; printf("SL Header: DTS "LLD", CTS "LLD"\n", stream->SLHeader->decodingTimeStamp, stream->SLHeader->compositionTimeStamp); }}void SLpacket_in_pes(M2TS_mux_stream *stream, char *Packet, u32 Size){ config_sample_hdr(stream); gf_sl_packetize(stream->SLConfig, stream->SLHeader, stream->sample->data, stream->sample->dataLength, &stream->sl_packet, &stream->sl_packet_len);}GF_List *CreateTSPacketsFromSLPacket(M2TS_mux_stream *stream, char *SLPacket, u32 SL_Size){ u8 table_id; u16 table_id_extension; MP42TS_Buffer *B; GF_List *sections, *ts_packet; if (stream->MP4_type == GF_ISOM_MEDIA_SCENE){ table_id = GF_M2TS_TABLE_ID_MPEG4_BIFS; }else if (stream->MP4_type == GF_ISOM_MEDIA_OD){ table_id = GF_M2TS_TABLE_ID_MPEG4_OD; } table_id_extension = 0; GF_SAFEALLOC(B, MP42TS_Buffer); B->length = SL_Size; B->data = SLPacket; sections = CreateSections(B, table_id, table_id_extension, stream->SL_section_version_number); B = EncodeSections(sections); ts_packet = CreateTSPacketsFromSections(B, stream->mpeg2_es_pid, &stream->continuity_counter); free(B); stream->SL_section_version_number ++; if (stream->SL_section_version_number > 32) stream->SL_section_version_number = 0; return ts_packet;}MP42TS_Buffer *get_iod(GF_BitStream *bs){ GF_Err e; GF_InitialObjectDescriptor *iod; u32 DescSize =0; GF_BitStream *bs_out; MP42TS_Buffer *B; iod = (GF_InitialObjectDescriptor *)gf_odf_new_iod(); e = gf_odf_read_iod(bs, iod, DescSize); bs_out = gf_bs_new(NULL,0,GF_BITSTREAM_WRITE); e = gf_odf_write_iod(bs_out, iod); GF_SAFEALLOC(B, MP42TS_Buffer); B->data = malloc(DescSize); gf_bs_get_content(bs_out, &B->data, &B->length); gf_bs_del(bs); return B;}/********************************************************************************** * PSI related functions **********************************************************************************//*************************** PMT *****************************/void InitializePMT(GF_M2TS_Program *program){ u32 i; program->pcr_pid = 0; for (i = 0; i<gf_list_count(program->streams); i++) { M2TS_mux_stream *stream = (M2TS_mux_stream *)gf_list_get(program->streams, i); if (stream->MP2_type == GF_M2TS_VIDEO_MPEG2) { program->pcr_pid = stream->mpeg2_es_pid; } else if (!program->pcr_pid) { program->pcr_pid = stream->mpeg2_es_pid; } }}MP42TS_Buffer *EncodePMT(GF_M2TS_Program *program, MP42TS_Buffer *iod){ u32 i; MP42TS_Buffer *B; return B;}void CreateTSPacketsForPMTs(M2TS_muxer *muxer){ u32 i, j, nb_progs; GF_M2TS_Program *program; M2TS_mux_stream *stream; MP42TS_Buffer *B; GF_List *sections; Bool use_iod = 0; MP42TS_Buffer *B_iod; muxer->pmt_ts_packet = gf_list_new(); nb_progs = gf_list_count(muxer->pat_table); for (i= 0; i<nb_progs ;i++) { program = gf_list_get(muxer->pat_table,i); program->streams = gf_list_new(); for (j = 0; j < gf_list_count(muxer->streams); j++) { stream = gf_list_get(muxer->streams, j); stream->mpeg2_es_pid = 100*(i+1)+10*(j+1); gf_list_add(program->streams, stream); } InitializePMT(program); if (use_iod) { GF_ObjectDescriptor *iod; GF_BitStream *bs_iod; /* iod */ iod = (GF_ObjectDescriptor *)gf_isom_get_root_od(muxer->mp4_in); /* Mise
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -