StagefrightRecoder: Disabling B-frame support Disabling b-frame support from stagefright recorder in case of audio source as mic and video source is surface use case only because screen recorder with microphone doesn't play in sync if b-frame is enabled. If the audio source selected is INTERNAL (i.e. device) or MIC_AND_INTERNAL with screen recorder then b frame is supported. Bug: 288549440 Test: manually check screen recording with audio from mic has audio/video in synch (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:af685c66bab17b71fe1624f76b5d55628f79e6fa) (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:da3407f7688f35eb2dce79f1405feeb182241a3c) Merged-In: I4098655eb9687fb633085333bc140634441566e6 Change-Id: I4098655eb9687fb633085333bc140634441566e6
diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp index 0365085..e0449ff 100644 --- a/media/libmediaplayerservice/StagefrightRecorder.cpp +++ b/media/libmediaplayerservice/StagefrightRecorder.cpp
@@ -2099,6 +2099,11 @@ if (tsLayers > 1) { 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) { + bLayers = 0; + } uint32_t pLayers = tsLayers - bLayers; format->setString( "ts-schema", AStringPrintf("android.generic.%u+%u", pLayers, bLayers));