Sink patch - kensuke/How-to-Miracast-on-AOSP GitHub Wiki
.
Hardware Video Decoder Setting - View maguro source(no edit)
- need "video/avc" H/W decoder
- Reference(Nexus 4): /device/lge/mako/media_codecs.xml
<Decoders>
<MediaCodec name="OMX.qcom.video.decoder.avc" type="video/avc" > <!-- H/W Video Decoder -->
<Quirk name="requires-allocate-on-input-ports" />
<Quirk name="requires-allocate-on-output-ports"/>
<Quirk name="defers-output-buffer-allocation"/>
</MediaCodec>
<MediaCodec name="OMX.google.h264.decoder" type="video/avc" /> <!-- S/W Video Decoder -->
<MediaCodec name="OMX.google.aac.decoder" type="audio/mp4a-latm" /> <!-- S/W Audio Decoder -->
</Decoders>
Respond to Wi-Fi Direct Scanning - View AOSP patch
- /frameworks/base/services/java/com/android/server/display/WifiDisplayController.java
- /platform/frameworks/base/wifi/java/android/net/wifi/p2p/WifiP2pWfdInfo.java
private void updateWfdEnableState() {
if (mWifiDisplayOnSetting && mWifiP2pEnabled) {
// WFD should be enabled.
if (!mWfdEnabled && !mWfdEnabling) {
mWfdEnabling = true;
WifiP2pWfdInfo wfdInfo = new WifiP2pWfdInfo();
wfdInfo.setWfdEnabled(true);
- wfdInfo.setDeviceType(WifiP2pWfdInfo.WFD_SOURCE);
+ wfdInfo.setDeviceType(WifiP2pWfdInfo.SOURCE_OR_PRIMARY_SINK);
I/wpa_supplicant(20933): p2p0: P2P-DEVICE-FOUND 00:90:00:00:43:18
p2p_dev_addr=00:90:00:00:43:18
pri_dev_type=8-0050F204-5
name='Wifi display00:90:00:00:43:18'
config_methods=0x88
dev_capab=0x25
group_capab=0xa
wfd_dev_info=0x0000060151022a012c
wps: 136
wfdInfo:
WFD enabled: true
WFD DeviceInfo: 337
WFD CtrlPort: 554
WFD MaxThroughput: 300
I/wpa_supplicant(20933): p2p0: P2P-DEVICE-FOUND 22:e5:2a:71:99:40
p2p_dev_addr=22:e5:2a:71:99:40
pri_dev_type=7-0050F204-1
name='Push2TV 719940-PTV3000'
config_methods=0x88
dev_capab=0x25
group_capab=0x0
wfd_dev_info=0x000006015d022a0032
wps: 136
wfdInfo:
WFD enabled: true
WFD DeviceInfo: 349
WFD CtrlPort: 554
WFD MaxThroughput: 50
I/wpa_supplicant(20933): p2p0: P2P-DEVICE-FOUND a2:0b:ba:ba:44:d1
p2p_dev_addr=a2:0b:ba:ba:44:d1
pri_dev_type=10-0050F204-5
name='Galaxy_Nexus'
config_methods=0x188
dev_capab=0x24
group_capab=0x0
wfd_dev_info=0x00000600101c440032
wps: 392
wfdInfo:
WFD enabled: true
WFD DeviceInfo: 16 // <-
WFD CtrlPort: 7236
WFD MaxThroughput: 50
I/wpa_supplicant(31706): p2p0: P2P-DEVICE-FOUND a2:0b:ba:ba:44:d1
p2p_dev_addr=a2:0b:ba:ba:44:d1
pri_dev_type=10-0050F204-5
name='Galaxy_Nexus'
config_methods=0x188
dev_capab=0x24
group_capab=0x0
wfd_dev_info=0x00000600131c440032
wps: 392
wfdInfo:
WFD enabled: true
WFD DeviceInfo: 19 // <-
WFD CtrlPort: 7236
WFD MaxThroughput: 50
AOSP Sink Response "xxx" Fix - View AOSP patch
void WifiDisplaySink::onGetParameterRequest(
int32_t sessionID,
int32_t cseq,
const sp<ParsedMessage> &data) {
+ //AString body =
+ // "wfd_video_formats: xxx\r\n"
+ // "wfd_audio_codecs: xxx\r\n"
+ // "wfd_client_rtp_ports: RTP/AVP/UDP;unicast xxx 0 mode=play\r\n";
AString body =
+ "wfd_video_formats: xxx\r\n" // TODO FIXMI ^^;;
+ "wfd_audio_codecs: LPCM 00000003 00, AAC 0000000F 00\r\n"
+ "wfd_client_rtp_ports: RTP/AVP/UDP;unicast 19000 0 mode=play\r\n";
Display Size Fix - View AOSP patch
#include <ui/DisplayInfo.h>
+#include <gui/ISurfaceComposer.h>
namespace android {
// ...
void TunnelRenderer::initPlayer() {
if (mSurfaceTex == NULL) {
mComposerClient = new SurfaceComposerClient;
CHECK_EQ(mComposerClient->initCheck(), (status_t)OK);
DisplayInfo info;
SurfaceComposerClient::getDisplayInfo(0, &info);
ssize_t displayWidth = info.w;
ssize_t displayHeight = info.h;
+ ALOGD("initPlayer() default size[%d, %d]", info.w, info.h);
+ sp<IBinder> display = SurfaceComposerClient::getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain);
+ SurfaceComposerClient::getDisplayInfo(display, &info);
+ displayWidth = info.w;
+ displayHeight = info.h;
+ ALOGD("initPlayer() fixed size[%d, %d]", info.w, info.h);
- This patch is refer to /frameworks/native/libs/gui/Surface.cpp
void Surface::init(const sp<ISurfaceTexture>& surfaceTexture);
I/RTPSink ( 4694): connecting RTP/RTCP sockets to 192.168.2.4:{15550,15551}
D/NetworkSession( 4694): --> --> --> sendRequest() session[1] result[0]
D/NetworkSession( 4694): [PLAY rtsp://x.x.x.x:x/wfd1.0/streamid=0 RTSP/1.0
D/NetworkSession( 4694): Date: Tue, 25 Jun 2013 06:27:18 +0000
D/NetworkSession( 4694): User-Agent: stagefright/1.1 (Linux;Android 4.1)
D/NetworkSession( 4694): CSeq: 3
D/NetworkSession( 4694): Session: 1637933221
D/NetworkSession( 4694):
D/NetworkSession( 4694): ]
E/SurfaceFlinger( 128): createLayer() failed, w or h is negative (w=-1090880868, h=34)
F/TunnelRenderer( 4694): frameworks/av/media/libstagefright/wifi-display/sink/TunnelRenderer.cpp:349 CHECK(mSurfaceControl != NULL) failed.
F/libc ( 4694): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 4694 (wfd)
I/DEBUG ( 126): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG ( 126): Build fingerprint: 'Android/full_maguro/maguro:4.2.2/JDQ39E/eng.satoken.20130622.212216:userdebug/test-keys'
I/DEBUG ( 126): Revision: '9'
I/DEBUG ( 126): pid: 4694, tid: 4694, name: wfd >>> wfd <<<
I/DEBUG ( 126): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
D/NetworkSession( 1361): ]
I/RTPSink ( 1361): packet was 0.53 ms late
I/RTPSink ( 1361): packet was 0.18 ms late
I/TunnelRenderer( 1361): initPlayer() default size[1167973836, 34]
I/TunnelRenderer( 1361): initPlayer() patched size[720, 1280]
,
,
,
,
When in Miracast Sink, Display Rotate 90 Degrees - View AOSP patch
status_t SurfaceTexture::updateTexImage(BufferRejecter* rejecter, bool skipSync) {
// ...
+ // when in miracast...
+ // /frameworks/av/media/libstagefright/wifi-display/sink/TunnelRenderer.cpp
+ // mSurfaceControl = mComposerClient->createSurface( String8("A Sink Surface"),
+ if (rejecter && mName == "A Sink Surface") {
+ item.mTransform |= 0x04;
+ ST_LOGW("updateTexImage() Force Transform::ROT_90 [%d, %d]", mSlots[buf].mGraphicBuffer->getWidth(), mSlots[buf].mGraphicBuffer->getHeight());
+ }
+
// Update the SurfaceTexture state.
mCurrentTexture = buf;
- What's "0x04" ?
- /frameworks/native/services/surfaceflinger/Transform.h
enum orientation_flags {
ROT_0 = 0x00000000,
FLIP_H = HAL_TRANSFORM_FLIP_H,
FLIP_V = HAL_TRANSFORM_FLIP_V,
ROT_90 = HAL_TRANSFORM_ROT_90,
ROT_180 = FLIP_H|FLIP_V,
ROT_270 = ROT_180|ROT_90,
ROT_INVALID = 0x80
};
enum {
/* flip source image horizontally (around the vertical axis) */
HAL_TRANSFORM_FLIP_H = 0x01,
/* flip source image vertically (around the horizontal axis)*/
HAL_TRANSFORM_FLIP_V = 0x02,
/* rotate source image 90 degrees clockwise */
HAL_TRANSFORM_ROT_90 = 0x04,
/* rotate source image 180 degrees */
HAL_TRANSFORM_ROT_180 = 0x03,
/* rotate source image 270 degrees clockwise */
HAL_TRANSFORM_ROT_270 = 0x07,
};
,
,
,
,
(diff code is here!)