Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f5a01fa5 authored by Rakesh Kumar's avatar Rakesh Kumar
Browse files

StagefrightRecoder: Use flag to enable or disable b-frame

Use flag to enable or disable b-frame support in screen recorder.

Also fix mediaTimeTicks calculation in mpeg4writer.
If video track starting at 0 then video's timescale (i.e. mTimeScale)
is used to calculate mediaTime (i.e. mediaTimeTicks) but in case of
video start with positive start offset then mpeg4 writer's timescale
(i.e. mvhdTimeScale) is used to calculate mediatime (i.e. editDurationTicks).
Modified mediaTimeTicks calculation to use mTimeScale even in case of
video start with positive start offset.

Bug: 288549440
Bug: 341121900
Test: muxer poc in bug
Test: manual
Test: adb shell setprop persist.device_config.aconfig_flags. \
media_solutions.com.android.media.editing.flags. \
stagefrightrecorder_enable_b_frames true
Test: adb shell device_config put media_solutions \
com.android.media.editing.flags. \
stagefrightrecorder_enable_b_frames true

Change-Id: I84585fb233ed914ba2c1d8d95f0071071318c5bf
parent f4ce838d
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ cc_defaults {
        "android.hardware.media.omx@1.0",
        "av-types-aidl-cpp",
        "framework-permission-aidl-cpp",
        "libaconfig_storage_read_api_cc",
        "libaudioclient_aidl_conversion",
        "libbase",
        "libbinder_ndk",
@@ -76,6 +77,7 @@ cc_defaults {
        "libstagefright_httplive",
        "libutils",
        "packagemanager_aidl-cpp",
        "server_configurable_flags",
    ],

    header_libs: [
@@ -86,6 +88,7 @@ cc_defaults {
    ],

    static_libs: [
        "com.android.media.flags.editing-aconfig-cc",
        "libplayerservice_datasource",
        "libstagefright_nuplayer",
        "libstagefright_rtsp",
+3 −1
Original line number Diff line number Diff line
@@ -68,6 +68,7 @@
#include <system/audio.h>

#include <media/stagefright/rtsp/ARTPWriter.h>
#include <com_android_media_editing_flags.h>

namespace android {

@@ -2121,7 +2122,8 @@ status_t StagefrightRecorder::setupVideoEncoder(
        uint32_t bLayers = std::min(2u, tsLayers - 1); // use up-to 2 B-layers
        // TODO(b/341121900): Remove this once B frames are handled correctly in screen recorder
        // use case in case of mic only
        if (mAudioSource == AUDIO_SOURCE_MIC && mVideoSource == VIDEO_SOURCE_SURFACE) {
        if (!com::android::media::editing::flags::stagefrightrecorder_enable_b_frames()
                && mAudioSource == AUDIO_SOURCE_MIC && mVideoSource == VIDEO_SOURCE_SURFACE) {
            bLayers = 0;
        }
        uint32_t pLayers = tsLayers - bLayers;
+1 −0
Original line number Diff line number Diff line
@@ -321,6 +321,7 @@ cc_library {

    static_libs: [
        "android.media.codec-aconfig-cc",
        "com.android.media.flags.editing-aconfig-cc",
        "libstagefright_esds",
        "libstagefright_color_conversion",
        "libyuv",
+13 −3
Original line number Diff line number Diff line
@@ -53,6 +53,8 @@
#include <media/esds/ESDS.h>
#include "include/HevcUtils.h"

#include <com_android_media_editing_flags.h>

#ifndef __predict_false
#define __predict_false(exp) __builtin_expect((exp) != 0, 0)
#endif
@@ -4944,6 +4946,8 @@ void MPEG4Writer::Track::writeEdtsBox() {
            // Track with start offset.
            ALOGV("Tracks starting > 0");
            int32_t editDurationTicks = 0;
            int32_t trackStartOffsetBFramesUs = getMinCttsOffsetTimeUs() - kMaxCttsOffsetTimeUs;
            ALOGV("trackStartOffsetBFramesUs:%" PRId32, trackStartOffsetBFramesUs);
            if (mMinCttsOffsetTicks == mMaxCttsOffsetTicks) {
                // Video with no B frame or non-video track.
                editDurationTicks =
@@ -4952,8 +4956,6 @@ void MPEG4Writer::Track::writeEdtsBox() {
                ALOGV("editDuration:%" PRId64 "us", (trackStartOffsetUs + movieStartOffsetBFramesUs));
            } else {
                // Track with B frame.
                int32_t trackStartOffsetBFramesUs = getMinCttsOffsetTimeUs() - kMaxCttsOffsetTimeUs;
                ALOGV("trackStartOffsetBFramesUs:%" PRId32, trackStartOffsetBFramesUs);
                editDurationTicks =
                        ((trackStartOffsetUs + movieStartOffsetBFramesUs +
                          trackStartOffsetBFramesUs) * mvhdTimeScale + 5E5) / 1E6;
@@ -4967,7 +4969,15 @@ void MPEG4Writer::Track::writeEdtsBox() {
            } else if (editDurationTicks < 0) {
                // Only video tracks with B Frames would hit this case.
                ALOGV("Edit list entry to negate start offset by B frames in other tracks");
                if (com::android::media::editing::flags::
                        stagefrightrecorder_enable_b_frames()) {
                    int32_t mediaTimeTicks =
                            ((trackStartOffsetUs + movieStartOffsetBFramesUs +
                              trackStartOffsetBFramesUs) * mTimeScale - 5E5) / 1E6;
                    addOneElstTableEntry(tkhdDurationTicks, std::abs(mediaTimeTicks), 1, 0);
                } else {
                    addOneElstTableEntry(tkhdDurationTicks, std::abs(editDurationTicks), 1, 0);
                }
            } else {
                ALOGV("No edit list entry needed for this track");
            }
+14 −10
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ package {
    // to get the below license kinds:
    //   SPDX-license-identifier-Apache-2.0
    default_applicable_licenses: ["frameworks_av_media_libstagefright_license"],
    default_team: "trendy_team_android_media_solutions_editing",
}

cc_defaults {
@@ -35,14 +36,17 @@ cc_defaults {
        "include",
    ],
    static_libs: [
        "com.android.media.flags.editing-aconfig-cc",
        "liblog",
        "libstagefright_foundation",
        "libstagefright",
        "libstagefright_foundation",
    ],
    shared_libs: [
        "libaconfig_storage_read_api_cc",
        "libbinder",
        "libcutils",
        "libutils",
        "server_configurable_flags",
    ],
}