Skip to content
RC3 edited this page Jul 19, 2013 · 11 revisions

.

Hardware Video Decoder Setting - View maguro source(no edit)

    <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

     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);

Sink - Q-WH-D1

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

Sink - PTV3000

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

Android - Galaxy Nexus default

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

Android - Galaxy Nexus patched

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);
void Surface::init(const sp<ISurfaceTexture>& surfaceTexture);

no patch

      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

after patched

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]

Result - wfd command based

Source : Nexus 4(left img), Sink : Galaxy Nexus(right img), Screen : Vertical

,

Source : Nexus 4(left img), Sink : Galaxy Nexus(right img), Screen : Horizontal

,

Result - framework based

Source : Nexus 4(left img), Sink : Galaxy Nexus(right img), Screen : Vertical

,

Source : Nexus 4(left img), Sink : Galaxy Nexus(right img), Screen : Horizontal

,

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;
            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,
};

Result - framework based

Source : Nexus 4(left img), Sink : Galaxy Nexus(right img), Screen : Vertical

, ,

Source : Nexus 4(left img), Sink : Galaxy Nexus(right img), Screen : Horizontal

, ,

Source : Nexus 4(upper img), Sink : Galaxy Nexus(below img), Screen : Attack on Titan

Invoke Sink when p2p conncted

JNI Sink App(, merge to Settings App)

(opt, refs) execute wfd command

(diff code is here!)