Skip to content

Commit

Permalink
Merge tag 'LA.QSSI.15.0.r1-13300-qssi.0' of https://git.codelinaro.or…
Browse files Browse the repository at this point in the history
…g/clo/la/platform/frameworks/av into HEAD

LA.QSSI.15.0.r1-13300-qssi.0

* tag 'LA.QSSI.15.0.r1-13300-qssi.0' of https://git.codelinaro.org/clo/la/platform/frameworks/av:
  Updates for muxing MV-HEVC bitstream
  libmediaplayerservice: NuPlayer: playback: fix anchor time
  Revert "av: Fix frames consumed for pcm during flush scenarios"
  Codec2: Disable buffer wrapping only for 64bit
  omx: check HDR10+ info param size

Change-Id: I437d784ddc3ca6ae19d87a1764ea20eb3819ba2b
  • Loading branch information
gotenksIN committed Feb 2, 2025
2 parents d5cf111 + 199ca24 commit 014b66d
Show file tree
Hide file tree
Showing 9 changed files with 261 additions and 217 deletions.
32 changes: 32 additions & 0 deletions media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ NuPlayer::Renderer::Renderer(
mAudioEOSGeneration(0),
mMediaClock(mediaClock),
mPlaybackSettings(AUDIO_PLAYBACK_RATE_DEFAULT),
mLastAudioAnchorNowUs(-1),
mAudioFirstAnchorTimeMediaUs(-1),
mAudioAnchorTimeMediaUs(-1),
mAnchorTimeMediaUs(-1),
Expand Down Expand Up @@ -682,6 +683,8 @@ void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) {
mAnchorTimeMediaUs = mediaTimeUs;
}

forceAudioUpdateAnchorTime();

mDrainVideoQueuePending = false;

onDrainVideoQueue();
Expand Down Expand Up @@ -1039,6 +1042,7 @@ size_t NuPlayer::Renderer::fillAudioBuffer(void *buffer, size_t size) {
// we don't know how much data we are queueing for offloaded tracks.
mMediaClock->updateAnchor(nowMediaUs, nowUs, INT64_MAX);
mAnchorTimeMediaUs = nowMediaUs;
mLastAudioAnchorNowUs = nowUs;
}

// for non-offloaded audio, we need to compute the frames written because
Expand Down Expand Up @@ -1473,6 +1477,34 @@ void NuPlayer::Renderer::postDrainVideoQueue() {
mDrainVideoQueuePending = true;
}

void NuPlayer::Renderer::forceAudioUpdateAnchorTime() {
if (!(mHasAudio && offloadingAudio())) {
return;
}
{
Mutex::Autolock autoLock(mLock);
if (mLastAudioAnchorNowUs < 0) {
return;
}

const static auto kAudioAnchorTimeExpiryMs =
property_get_int32("media.stagefright.audio.offload.anchor_time.expiry_ms", 5000);
const static int64_t kAudioAnchorTimeExpiryUs = kAudioAnchorTimeExpiryMs * 1000;

int64_t nowUs = ALooper::GetNowUs();

if (kAudioAnchorTimeExpiryUs > (nowUs - mLastAudioAnchorNowUs)) {
return;
}

int64_t nowMediaUs =
mAudioFirstAnchorTimeMediaUs + mAudioSink->getPlayedOutDurationUs(nowUs);
mMediaClock->updateAnchor(nowMediaUs, nowUs, INT64_MAX);
mLastAudioAnchorNowUs = nowUs;
ALOGI("%s: applied", __func__);
}
}

void NuPlayer::Renderer::onDrainVideoQueue() {
if (mVideoQueue.empty()) {
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,7 @@ struct NuPlayer::Renderer : public AHandler {
AVSyncSettings mSyncSettings;
float mVideoFpsHint;

int64_t mLastAudioAnchorNowUs;
int64_t mAudioFirstAnchorTimeMediaUs;
// previous audio anchor timestamp, in media time base.
int64_t mAudioAnchorTimeMediaUs;
Expand Down Expand Up @@ -289,6 +290,8 @@ struct NuPlayer::Renderer : public AHandler {
void onDrainVideoQueue();
void postDrainVideoQueue();

void forceAudioUpdateAnchorTime();

void prepareForMediaRenderingStart_l();
void notifyIfMediaRenderingStarted_l();

Expand Down
100 changes: 39 additions & 61 deletions media/libstagefright/HevcUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -225,88 +225,86 @@ status_t HevcParameterSets::parseVps(const uint8_t* data, size_t size) {
if (reader.atLeastNumBitsLeft(96)) {
err = parseProfileTierLevel(1, maxSubLayersMinusOne, reader, 1);
ALOGV("kMaxLayersMinus1 : %d", maxLayersMinusOne);
if (maxLayersMinusOne == 0) { // main(10) profile
mParams.add(kNumViews, 1);
if (err != OK) {
ALOGE("error parsing PTL in VPS");
return err;
}
ALOGV("PTL parsing correctly.");
return err;
}
} else {
reader.skipBits(96);
return reader.overRead() ? ERROR_MALFORMED : OK;
}

if (maxLayersMinusOne == 0) { // main(10) profile
mParams.add(kNumViews, 1);
if (err != OK) {
ALOGE("error parsing PTL in VPS for HEVC main profile");
return err;
}
ALOGV("PTL parsing correctly for HEVC main profile.");
return err;
} else if (maxLayersMinusOne != 0 && maxLayersMinusOne != 1) { // Currently we consider layer 0 and 1 only
ALOGE("VPS maxLayersMinusOne is greater than 1.");
return ERROR_MALFORMED;
}
// Additional parsing bits for more information
bool subLayerOrderingInfoPresentFlag;
subLayerOrderingInfoPresentFlag = reader.getBits(1);
// 129 bits read until this point
bitCounter += 129;
ALOGV("maxSubLayersMinusOne : %d", maxSubLayersMinusOne);

for (size_t i = (subLayerOrderingInfoPresentFlag? 0 : maxSubLayersMinusOne);
i <= maxSubLayersMinusOne; i++) {
//skip vps_max_dec_pic_buffering_minus1[i]
bitCounter += numBitsParsedExpGolomb( parseUEWithFallback(&reader, 0U) );
parseUEWithFallback(&reader, 0U);
//skip vps_max_num_reorder_pics[i]
bitCounter += numBitsParsedExpGolomb( parseUEWithFallback(&reader, 0U) );
parseUEWithFallback(&reader, 0U);
//skip vps_max_latency_increase_plus1[i]
bitCounter += numBitsParsedExpGolomb( parseUEWithFallback(&reader, 0U) );
parseUEWithFallback(&reader, 0U);
}

uint8_t maxLayerId, numLayerSetsMinusOne;
// vps_max_layer_id
maxLayerId = reader.getBits(6); bitCounter += 6;
maxLayerId = reader.getBits(6);
// vps_num_layer_sets_minus1
numLayerSetsMinusOne = parseUEWithFallback(&reader, 0U);
bitCounter += numBitsParsedExpGolomb(numLayerSetsMinusOne);
for (size_t i = 1; i <= numLayerSetsMinusOne; i++) {
for (size_t j = 0; j <= maxLayerId; j++) {
// Skip layer_id_included_flag[i][j]
reader.skipBits(1); bitCounter++;
reader.skipBits(1);
}
}

// vps_timing_info_present_flag
bool timingInfoPresentFlag = reader.getBits(1); ++bitCounter;
bool timingInfoPresentFlag = reader.getBits(1);
if (timingInfoPresentFlag) {
// Skip vps_num_units_in_tick
reader.skipBits(32);
// skip vps_time_scale
reader.skipBits(32);
// vps_poc_proportional_to_timing_flag
bool pocProportionalToTimingFlag = reader.getBits(1);
bitCounter += 65;
if (pocProportionalToTimingFlag) {
// skip vps_num_ticks_poc_diff_one_minus1;
bitCounter += numBitsParsedExpGolomb( parseUEWithFallback(&reader, 0U) );
parseUEWithFallback(&reader, 0U);
}
// skip vps_num_hrd_parameters
uint8_t numHrdParameters = parseUEWithFallback(&reader, 0U);
bitCounter += numBitsParsedExpGolomb( numHrdParameters );
for (size_t i = 0; i < numHrdParameters; i++) {
// skip hrd_layer_set_idx[i]
bitCounter += numBitsParsedExpGolomb( parseUEWithFallback(&reader, 0U) );
parseUEWithFallback(&reader, 0U);
bool cprmsPresentFlag = false;
if (i > 0) {
// cprms_present_flag[i]
cprmsPresentFlag = reader.getBits(1); ++bitCounter;
cprmsPresentFlag = reader.getBits(1);
}
err = parseHrdParameters(cprmsPresentFlag,
maxSubLayersMinusOne, bitCounter, &reader);
maxSubLayersMinusOne, &reader);
if (err != OK) {
ALOGE("error parsing HRD Parameters");
return err;
}
}
}

bool extensionFlag = reader.getBits(1); ++bitCounter;
bool extensionFlag = reader.getBits(1);
if (extensionFlag) {
while (!byteAligned(bitCounter)) {
while(!byteAligned(reader.numBitsLeft())) {
// skip vps_extension_alignment_bit_equal_to_one
reader.skipBits(1); ++bitCounter;
reader.skipBits(1);
}
status_t err = parseVpsExtension(kMaxLayersMinusOne,
baseLayerInternalFlag, reader);
Expand Down Expand Up @@ -638,18 +636,17 @@ status_t HevcParameterSets::parseProfileTierLevel(const bool profilePresentFlag,
return reader.overRead() ? ERROR_MALFORMED : OK;
}

status_t HevcParameterSets::parseHrdParameters(const bool cprmsPresentFlag, uint8_t maxNumSubLayersMinus1, size_t &bitCounter, NALBitReader* reader) {
status_t HevcParameterSets::parseHrdParameters(const bool cprmsPresentFlag, uint8_t maxNumSubLayersMinus1, NALBitReader* reader) {
bool nalHrdParamPresentFlag=0, vclHrdParamPresentFlag=0, subPicHrdParamsPresentFlag = 0;
if (cprmsPresentFlag) {
// nal_hrd_parameters_present_flag
nalHrdParamPresentFlag = reader->getBits(1);
// vcl_hrd_parameters_present_flag
vclHrdParamPresentFlag = reader->getBits(1);
bitCounter += 2;

if (nalHrdParamPresentFlag || vclHrdParamPresentFlag) {
// sub_pic_hrd_params_present_flag
subPicHrdParamsPresentFlag = reader->getBits(1); ++bitCounter;
subPicHrdParamsPresentFlag = reader->getBits(1);
if (subPicHrdParamsPresentFlag) {
// Skip tick_divisor_minus2
reader->skipBits(8);
Expand All @@ -659,7 +656,6 @@ status_t HevcParameterSets::parseHrdParameters(const bool cprmsPresentFlag, uint
reader->skipBits(1);
// Skip dpb_output_delay_du_length_minus1
reader->skipBits(5);
bitCounter += 19;
}
// Skip bit_rate_scale
reader->skipBits(4);
Expand All @@ -668,48 +664,45 @@ status_t HevcParameterSets::parseHrdParameters(const bool cprmsPresentFlag, uint
if (subPicHrdParamsPresentFlag) {
// Skip cbp_size_du_scale
reader->skipBits(4);
bitCounter += 4;
}
// Skip initial_cpb_removal_delay_length_minus1
reader->skipBits(5);
// Skip au_cpb_removal_delay_length_minus1
reader->skipBits(5);
// Skip dpb_output_delay_length_minus1
reader->skipBits(5);
bitCounter += 23;
}
}

for (size_t i = 0; i <= maxNumSubLayersMinus1; i++) {
uint8_t cpbCntMinus1=0;
bool fixedPicRateGeneralFlag = 0, fixedPicRateWithinCvsFlag = 0, lowDelayHrdFlag = 0;
// fixed_pic_rate_general_flag[i]
fixedPicRateGeneralFlag = reader->getBits(1); ++bitCounter;
fixedPicRateGeneralFlag = reader->getBits(1);
if (!fixedPicRateGeneralFlag) {
// fixed_pic_rate_within_cvs_flag[i]
fixedPicRateWithinCvsFlag = reader->getBits(1); ++bitCounter;
fixedPicRateWithinCvsFlag = reader->getBits(1);
}
if ( fixedPicRateWithinCvsFlag) {
// Skip elemental_duration_in_tc_minus1[i]
bitCounter += numBitsParsedExpGolomb(parseUEWithFallback(reader, 0U));
parseUEWithFallback(reader, 0U);
} else {
// low_delay_hrd_flag[i]
lowDelayHrdFlag = reader->getBits(1); ++bitCounter;
lowDelayHrdFlag = reader->getBits(1);
}
if (!lowDelayHrdFlag) {
// Skip cpb_cnt_minus1[i]
cpbCntMinus1 = parseUEWithFallback(reader, 0U);
bitCounter += numBitsParsedExpGolomb(cpbCntMinus1);
}
if (nalHrdParamPresentFlag) {
status_t err = parseSubLayerHrdParameters(subPicHrdParamsPresentFlag, cpbCntMinus1, bitCounter, reader);
status_t err = parseSubLayerHrdParameters(subPicHrdParamsPresentFlag, cpbCntMinus1, reader);
if (err != OK) {
ALOGE("error parsing Sub layer HRD Parameters (NAL)");
return err;
}
}
if (vclHrdParamPresentFlag) {
status_t err = parseSubLayerHrdParameters(subPicHrdParamsPresentFlag, cpbCntMinus1, bitCounter, reader);
status_t err = parseSubLayerHrdParameters(subPicHrdParamsPresentFlag, cpbCntMinus1, reader);
if (err != OK) {
ALOGE("error parsing Sub layer HRD Parameters (VCL)");
return err;
Expand All @@ -719,22 +712,21 @@ status_t HevcParameterSets::parseHrdParameters(const bool cprmsPresentFlag, uint
return reader->overRead() ? ERROR_MALFORMED : OK;
}

status_t HevcParameterSets::parseSubLayerHrdParameters(const bool subPicHrdParamsPresentFlag, const uint8_t cpbCntMinus1, size_t &bitCounter, NALBitReader *reader) {
status_t HevcParameterSets::parseSubLayerHrdParameters(const bool subPicHrdParamsPresentFlag, const uint8_t cpbCntMinus1, NALBitReader *reader) {
uint8_t cpbCnt = cpbCntMinus1 + 1;
for (size_t i = 0; i < cpbCnt; i++) {
// Skip bit_rate_value_minus1[i]
bitCounter += numBitsParsedExpGolomb(parseUEWithFallback(reader, 0U));
parseUEWithFallback(reader, 0U);
// Skip cpb_size_value_minus1[i]
bitCounter += numBitsParsedExpGolomb(parseUEWithFallback(reader, 0U));
parseUEWithFallback(reader, 0U);
if (subPicHrdParamsPresentFlag) {
// Skip cpb_size_du_value_minus1[i]
bitCounter += numBitsParsedExpGolomb(parseUEWithFallback(reader, 0U));
parseUEWithFallback(reader, 0U);
// Skip bit_rate_du_value_minus1[i]
bitCounter += numBitsParsedExpGolomb(parseUEWithFallback(reader, 0U));
parseUEWithFallback(reader, 0U);
}
// Skip cbr_flag[i]
reader->skipBits(1);
++bitCounter;
}
return reader->overRead() ? ERROR_MALFORMED : OK;
}
Expand Down Expand Up @@ -1126,20 +1118,6 @@ status_t HevcParameterSets::makeLhvc(uint8_t *lhvc, size_t *lhvcSize,
return OK;
}

void HevcParameterSets::makeStri(uint8_t *stri) {
ALOGV("makeStri()");
// Please refer to Stereo-video-isobmff-extensions for details.
uint8_t *header = stri;
// unsigned int(4) reserved
*header = 0;
// FIXME : unsigned int(1) eye_views_reversed - device-dependent information should be included
// unsigned int(1) has_additional_views = 0
// unsinged int(1) has_right_eye_view = 1
// unsigned int(1) has_left_eye_view = 1
*header |= 0x03;
ALOGV("stri : %#04x", *stri);
}

status_t HevcParameterSets::makeHero(uint8_t *hero) {
ALOGV("makeHero()");

Expand Down
Loading

0 comments on commit 014b66d

Please sign in to comment.