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

📄 sectionproducers.cpp

📁 1、简介 此代码是IS0 13818-5 MPEG2系统层协议分析代码
💻 CPP
字号:
/* Copyright (C) 1995, Tektronix Inc. All Rights Reserved. * *   Usage Restrictions * * License is granted to copy, to use, and to make and to use derivative * works for research and evaluation purposes only. * *   Disclaimer of Warranty * * These software programs are available to the user without any license * fee or royalty on an "as is" basis.  Tektronix Inc. disclaims any and * all warranties, whether express, implied, or statuary, including any * implied warranties or merchantability or of fitness for a particular * purpose.  In no event shall the copyright-holder be liable for any  * incidental, punitive, or consequential damages of any kind whatsoever * arising from the use of these programs. * * This disclaimer of warranty extends to the user of these programs and * user's customers, employees, agents, transferees, successors, and * assigns. * * The Tektronix Inc. does not represent or warrant that the programs * furnished hereunder are free of infringement of any third-party * patents.*//* SectionProducer classes implementations */#include "SectionProducers.H"#include "OPortToRam.H"extern "C"{#include <malloc.h>#include <stdio.h>}SectionProducer::SectionProducer (Encoder*e, Section* s) : Producer(e){  sec = s;}int SectionProducer::fill_buffer (){  if (buf) delete buf;  length_stored = sec->section_length + 4;  buf = (char*) malloc (length_stored);  OutputPort* save_port = oport;  oport = new OPortToRam(buf, length_stored, NULL);  send_section();  delete oport;  oport = save_port;  buf_index = 0;  return length_stored;}void SectionProducer::send_header_a (){  // send pointer field and stuffing bytes  oport->write_uimsbf(sec->pointer, 8);  for (int i = 0; i < sec->pointer; i++)    oport->write_byte(0xff);  // start CRC  oport->start_crc();  // send table_id  oport->write_uimsbf(sec->table_id, 8);  // send section_syntax_indicator  if (sec->section_syntax_code == 'S') oport->write_bit('1');  else oport->write_bit('0');  // send '0' and reserved bits  oport->write_bit('0');  oport->write_reserved_bits(2);  // send section_length  oport->write_uimsbf(sec->section_length, 12);}void SectionProducer::send_header_b (){  // send reserved bits  oport->write_reserved_bits(2);    // send version_number  oport->write_uimsbf(sec->version_number, 5);    // send current_next_indicator  if (sec->current_next_code == 'C') oport->write_bit('1');  else oport->write_bit('0');    // send section_number  oport->write_uimsbf(sec->section_number, 8);    // send last_section_number  oport->write_uimsbf(sec->last_section_number, 8);}void SectionProducer::send_CRC (){  oport->stop_crc();  oport->write_crc();}PATProducer::PATProducer (Encoder* e, PATSection* s)    : SectionProducer(e, s){  // set fields   patsec = s;  // set fields in patsec  patsec->section_length = 4 * encoder->get_dir()->get_num_programs() + 9;}void PATProducer::send_section (){  // send header_a  send_header_a();  // send transport_stream_id  oport->write_uimsbf(patsec->transport_stream_id, 16);    // send header_b  send_header_b();  // send loop  ProgramRecord* prec = encoder->get_dir()->head_prec;  while (prec)    {      // send program_number      int program_number = prec->program->program_number;      // FIX - who manages program_numbers; currently the program->pid      oport->write_uimsbf(program_number, 16);      // send reservered bits      oport->write_reserved_bits(3);      // send pid      int pid;      if (program_number == 0)	{	  pid = encoder->new_pid();	}      else	{	  pid = prec->program->pid;	}      oport->write_uimsbf(pid, 13);      prec = prec->next_prec;    }    // send CRC  send_CRC();}MapProducer::MapProducer (Encoder* e, MapSection* s)    : SectionProducer(e, s){  // set fields  mapsec = s;  // set fields in mapsec  mapsec->section_length = 5 * mapsec->program->get_num_streams() + 13;  // FIX - map sections currently assume no info descriptors}void MapProducer::send_section (){  // send header_a  send_header_a();  // send program_number  oport->write_uimsbf(mapsec->program_number, 16);    // send header_b  send_header_b();  // send program-specific info  oport->write_reserved_bits(3);  oport->write_uimsbf(mapsec->pcr_pid, 13);    oport->write_reserved_bits(4);  oport->write_uimsbf(0, 12);     // FIX - currently no info descriptors so info_length = 0    // send loop  EStreamRecord* erec = mapsec->program->head_erec;  while (erec)    {      oport->write_uimsbf(erec->estream->stream_type, 8);      oport->write_reserved_bits(3);      oport->write_uimsbf(erec->estream->pid, 13);      oport->write_reserved_bits(4);      oport->write_uimsbf(0, 12);      // FIX - currently descriptors length = 0      erec = erec->next_erec;    }    // send CRC  send_CRC();}CAProducer::CAProducer (Encoder* e, CASection* s) : SectionProducer(e, s){  casec = s;  // FIX - set section_length or other section fields in CASection}void CAProducer::send_section (){  // send header_a  send_header_a();  // send reserved_bits  oport->write_reserved_bits(16);    // send header_b  send_header_b();  // send loop  for (int i = 0; i < casec->section_length - 9; i += 4)    {      // FIX - CAProducer has to send CA_descriptor    }    // send CRC  send_CRC();}

⌨️ 快捷键说明

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