/** * marshal all SEI messages in provided list into one bitstream bs */ Void SEIWriter::writeSEImessages(TComBitIf& bs, const SEIMessages &seiList, const TComSPS *sps, Bool isNested) { #if ENC_DEC_TRACE if (g_HLSTraceEnable) xTraceSEIHeader(); #endif TComBitCounter bs_count; for (SEIMessages::const_iterator sei=seiList.begin(); sei!=seiList.end(); sei++) { // calculate how large the payload data is // TODO: this would be far nicer if it used vectored buffers bs_count.resetBits(); setBitstream(&bs_count); #if ENC_DEC_TRACE Bool traceEnable = g_HLSTraceEnable; g_HLSTraceEnable = false; #endif xWriteSEIpayloadData(bs_count, **sei, sps); #if ENC_DEC_TRACE g_HLSTraceEnable = traceEnable; #endif UInt payload_data_num_bits = bs_count.getNumberOfWrittenBits(); assert(0 == payload_data_num_bits % 8); setBitstream(&bs); UInt payloadType = (*sei)->payloadType(); for (; payloadType >= 0xff; payloadType -= 0xff) { WRITE_CODE(0xff, 8, "payload_type"); } WRITE_CODE(payloadType, 8, "payload_type"); UInt payloadSize = payload_data_num_bits/8; for (; payloadSize >= 0xff; payloadSize -= 0xff) { WRITE_CODE(0xff, 8, "payload_size"); } WRITE_CODE(payloadSize, 8, "payload_size"); /* payloadData */ #if ENC_DEC_TRACE if (g_HLSTraceEnable) xTraceSEIMessageType((*sei)->payloadType()); #endif xWriteSEIpayloadData(bs, **sei, sps); } if (!isNested) { xWriteRbspTrailingBits(); } }
/** * marshal a single SEI message sei, storing the marshalled representation * in bitstream bs. */ Void SEIWriter::writeSEImessage(TComBitIf& bs, const SEI& sei, TComSPS *sps) { /* calculate how large the payload data is */ /* TODO: this would be far nicer if it used vectored buffers */ TComBitCounter bs_count; bs_count.resetBits(); setBitstream(&bs_count); #if ENC_DEC_TRACE Bool traceEnable = g_HLSTraceEnable; g_HLSTraceEnable = false; #endif xWriteSEIpayloadData(bs_count, sei, sps); #if ENC_DEC_TRACE g_HLSTraceEnable = traceEnable; #endif UInt payload_data_num_bits = bs_count.getNumberOfWrittenBits(); assert(0 == payload_data_num_bits % 8); setBitstream(&bs); #if ENC_DEC_TRACE if (g_HLSTraceEnable) xTraceSEIHeader(); #endif UInt payloadType = sei.payloadType(); for (; payloadType >= 0xff; payloadType -= 0xff) { WRITE_CODE(0xff, 8, "payload_type"); } WRITE_CODE(payloadType, 8, "payload_type"); UInt payloadSize = payload_data_num_bits/8; for (; payloadSize >= 0xff; payloadSize -= 0xff) { WRITE_CODE(0xff, 8, "payload_size"); } WRITE_CODE(payloadSize, 8, "payload_size"); /* payloadData */ #if ENC_DEC_TRACE if (g_HLSTraceEnable) xTraceSEIMessageType(sei.payloadType()); #endif xWriteSEIpayloadData(bs, sei, sps); }