/* * Copyright 2015 Rockchip Electronics Co. LTD * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define MODULE_TAG "h264e_sei" #include #include "mpp_common.h" #include "mpp_bitwrite.h" #include "mpp_packet_impl.h" #include "h264e_debug.h" #include "h264_syntax.h" #include "h264e_sei.h" MPP_RET h264e_sei_to_packet(MppPacket packet, RK_S32 *len, RK_S32 type, RK_U8 uuid[16], const void *data, RK_S32 size) { void *pos = mpp_packet_get_pos(packet); void *pkt_base = mpp_packet_get_data(packet); size_t pkt_size = mpp_packet_get_size(packet); size_t length = mpp_packet_get_length(packet); const RK_U8 *src = (RK_U8 *)data; void *dst = pos + length; RK_S32 buf_size = (pkt_base + pkt_size) - (pos + length); MppWriteCtx bit_ctx; MppWriteCtx *bit = &bit_ctx; RK_S32 uuid_size = 16; RK_S32 payload_size = size + uuid_size; RK_S32 sei_size = 0; RK_S32 i; h264e_dbg_sei("write sei to pkt [%p:%u] [%p:%u]\n", pkt_base, pkt_size, pos, length); mpp_writer_init(bit, dst, buf_size); /* start_code_prefix 00 00 00 01 */ mpp_writer_put_raw_bits(bit, 0, 24); mpp_writer_put_raw_bits(bit, 1, 8); /* forbidden_zero_bit */ mpp_writer_put_raw_bits(bit, 0, 1); /* nal_ref_idc */ mpp_writer_put_raw_bits(bit, H264_NALU_PRIORITY_DISPOSABLE, 2); /* nal_unit_type */ mpp_writer_put_raw_bits(bit, H264_NALU_TYPE_SEI, 5); /* sei_payload_type_ff_byte */ for (i = 0; i <= type - 255; i += 255) mpp_writer_put_bits(bit, 0xff, 8); /* sei_last_payload_type_byte */ mpp_writer_put_bits(bit, type - i, 8); /* sei_payload_size_ff_byte */ for (i = 0; i <= payload_size - 255; i += 255) mpp_writer_put_bits(bit, 0xff, 8); /* sei_last_payload_size_byte */ mpp_writer_put_bits(bit, payload_size - i, 8); /* uuid_iso_iec_11578 */ for (i = 0; i < uuid_size; i++) mpp_writer_put_bits(bit, uuid[i], 8); /* sei_payload_data */ for (i = 0; i < size; i++) mpp_writer_put_bits(bit, src[i], 8); mpp_writer_trailing(bit); sei_size = mpp_writer_bytes(bit); if (len) *len = sei_size; mpp_packet_set_length(packet, length + sei_size); mpp_packet_add_segment_info(packet, H264_NALU_TYPE_SEI, length, sei_size); h264e_dbg_sei("sei data length %d pkt len %d -> %d\n", sei_size, length, length + sei_size); return MPP_OK; }