blob: dd79d3008ec574fb4e63d1d3ee69046b7bcb09df [file] [log] [blame]
/*
* Copyright 2022 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "bitstreams/bitfield_stream.h"
#include "bitstreams/h265_partial_parser.h"
#include "bitstreams/nalu_parser.h"
#include <assert.h>
#include <string.h>
#include "bitstream_helper.h"
#include "v4l2_macros.h"
bool is_h265_nalu_slice_type(enum H265NaluType type) {
switch (type) {
case kTrailN:
case kTrailR:
case kTsaN:
case kTsaR:
case kStsaN:
case kStsaR:
case kRadlN:
case kRadlR:
case kRaslN:
case kRaslR:
case kBlaWLp:
case kBlaWRadl:
case kBlaNLp:
case kIdrWRadl:
case kIdrNLp:
case kCraNut:
return true;
default:
return false;
}
}
bool is_h265_slice_first_in_picture(const H265Nalu *nalu) {
bool first_slice_segment_in_pic_flag = false;
BitfieldStream bfs = bitfield_stream_init(nalu->data + NALU_SIGNATURE_SIZE,
nalu->data + nalu->size);
bitfield_stream_skip_bits(&bfs, 16);
bitfield_stream_read_bits(&bfs, 1, &first_slice_segment_in_pic_flag);
return first_slice_segment_in_pic_flag;
}
H265Nalu parse_h265_nalu(uint8_t* curr_pos, uint8_t* end_pos) {
const Nalu base_nalu = tokenize_nalu(curr_pos, end_pos);
H265Nalu nalu = {.data=base_nalu.data,
.size=base_nalu.size};
BitfieldStream bfs = bitfield_stream_init(nalu.data + NALU_SIGNATURE_SIZE,
nalu.data + nalu.size);
uint8_t forbidden_bit = 0;
bitfield_stream_read_bits(&bfs, 1, &forbidden_bit);
assert(forbidden_bit == 0);
bitfield_stream_read_bits(&bfs, 6, &nalu.nal_unit_type);
bitfield_stream_read_bits(&bfs, 6, &nalu.nuh_layer_id);
bitfield_stream_read_bits(&bfs, 3, &nalu.nuh_temporal_id_plus1);
return nalu;
}