Пример #1
0
    def test_3_multi_browser_message(self):
        """
        Send message containing one asset directed at 'center' viewport
        assert for:
        - one browser on 'center' viewport and check url + geometry (with viewport offset)
        - empty browsers list on the other viewport
        """
        self.bridge_center.translate_director(self.message_3)
        self.bridge_right.translate_director(self.message_3)
        self.assertEqual(1, len(self.mock_publisher_center.published_messages))
        self.assertEqual(1, len(self.mock_publisher_right.published_messages))
        center_browser_1 = AdhocBrowser(id='adhoc_browser_center_0',
                                        scene_slug='test message',
                                        version='stable',
                                        kiosk=True,
                                        geometry=WindowGeometry(x=10,
                                                                y=10,
                                                                width=600,
                                                                height=800),
                                        url='http://www.lol.zomg')

        center_browser_2 = AdhocBrowser(id='adhoc_browser_center_1',
                                        scene_slug='test message',
                                        version='stable',
                                        kiosk=True,
                                        geometry=WindowGeometry(x=400,
                                                                y=200,
                                                                width=300,
                                                                height=200),
                                        url='http://www.lol2.zomg')

        center_browser_3 = AdhocBrowser(id='adhoc_browser_center_2',
                                        scene_slug='test message',
                                        version='stable',
                                        kiosk=True,
                                        geometry=WindowGeometry(x=10,
                                                                y=10,
                                                                width=888,
                                                                height=11),
                                        url='http://www.lol3.zomg')

        right_browser_4 = AdhocBrowser(id='adhoc_browser_right_0',
                                       scene_slug='test message',
                                       version='stable',
                                       kiosk=True,
                                       geometry=WindowGeometry(x=100,
                                                               y=100,
                                                               width=100,
                                                               height=100),
                                       url='http://www.lol4.zomg')

        rospy.loginfo("published adhoc browser => %s" % self.mock_publisher_center.published_messages[0])
        rospy.loginfo("asserted adhoc browser => %s" % AdhocBrowsers(browsers=[center_browser_1, center_browser_2, center_browser_3]))
        self.assertEqual(zero_id(AdhocBrowsers(browsers=[center_browser_1, center_browser_2, center_browser_3], scene_slug='test message')),
                         zero_id(self.mock_publisher_center.published_messages[0]))
        self.assertEqual(zero_id(AdhocBrowsers(browsers=[right_browser_4], scene_slug='test message')),
                         zero_id(self.mock_publisher_right.published_messages[0]))
        self.assertEqual(AdhocBrowsers, type(self.mock_publisher_center.published_messages[0]))
        self.assertEqual(AdhocBrowsers, type(self.mock_publisher_right.published_messages[0]))
Пример #2
0
    def test_3_multi_mplayer_message(self):
        """
        Send message containing one asset directed at 'center' viewport
        assert for:
        - one mplayer on 'center' viewport and check url + geometry (with viewport offset)
        - empty mplayers list on the other viewport
        """
        self.bridge_center.translate_director(self.message_3)
        self.bridge_right.translate_director(self.message_3)
        self.assertEqual(1, len(self.mock_publisher_center.published_messages))
        self.assertEqual(1, len(self.mock_publisher_right.published_messages))
        center_mplayer_1 = AdhocMedia(
            id='adhoc_media_video_center_0',
            geometry=WindowGeometry(x=10, y=10, width=600, height=800),
            media_type='video',
            url='http://lg-head/lg/assets/videos/bunny.mp4',
            on_finish='nothing')

        center_mplayer_2 = AdhocMedia(
            id='adhoc_media_video_center_1',
            geometry=WindowGeometry(x=400, y=200, width=300, height=200),
            media_type='video',
            url='http://lg-head/lg/assets/videos/bunny.mp4',
            on_finish='nothing')

        center_mplayer_3 = AdhocMedia(
            id='adhoc_media_video_center_2',
            geometry=WindowGeometry(x=10, y=10, width=888, height=11),
            media_type='video',
            url='http://lg-head/lg/assets/videos/bunny.mp4',
            on_finish='nothing')

        right_mplayer_4 = AdhocMedia(
            id='adhoc_media_video_right_0',
            geometry=WindowGeometry(x=100, y=100, width=100, height=100),
            media_type='video',
            url='http://lg-head/lg/assets/videos/bunny.mp4',
            on_finish='nothing')

        rospy.loginfo("published adhoc mplayer => %s" %
                      self.mock_publisher_center.published_messages[0])
        rospy.loginfo("asserted adhoc mplayer => %s" % AdhocMedias(
            medias=[center_mplayer_1, center_mplayer_2, center_mplayer_3]))
        self.assertEqual(
            AdhocMedias(
                medias=[center_mplayer_1, center_mplayer_2, center_mplayer_3]),
            self.mock_publisher_center.published_messages[0])
        self.assertEqual(AdhocMedias(medias=[right_mplayer_4]),
                         self.mock_publisher_right.published_messages[0])
        self.assertEqual(
            AdhocMedias,
            type(self.mock_publisher_center.published_messages[0]))
        self.assertEqual(AdhocMedias,
                         type(self.mock_publisher_right.published_messages[0]))
    def setUp(self):
        """
        - instantiate ManagedAdhocBrowser
        - run asserts on object's parameters
        """

        self.width = 1000
        self.height = 1001
        self.x = 1002
        self.y = 1003
        self.slug = 'testing_slug'
        self.url = 'http://justtesting.com'

        self.geometry = WindowGeometry(width=self.width,
                                       height=self.height,
                                       x=self.x,
                                       y=self.y)
        self.mab = ManagedAdhocBrowser(geometry=self.geometry,
                                       slug=self.slug,
                                       url=self.url)

        super(ManagedAdhocBrowser, self.mab).__init__(
            geometry=self.geometry,
            slug=self.slug,
            url=self.url,
            kiosk=True)
        rospy.logdebug("This is mab: %s" % self.mab.__dict__)
Пример #4
0
    def __init__(self, config_path, viewport):
        self.config_path = config_path
        self.viewport = viewport
        self.selected = False

        viewport_geometry = ManagedWindow.lookup_viewport_geometry(self.viewport)
        cmd = ['/usr/bin/onboard', '-m']

        onboard_width = viewport_geometry.width
        onboard_height = viewport_geometry.height / 4
        onboard_x = viewport_geometry.x
        onboard_y = viewport_geometry.y + (viewport_geometry.height - onboard_height)

        onboard_geometry = WindowGeometry(x=onboard_x,
                                          y=onboard_y,
                                          width=onboard_width,
                                          height=onboard_height)

        self.config = OnboardConfig(config_path=config_path).get_config()

        window = ManagedWindow(w_class='Onboard',
                               geometry=onboard_geometry,
                               visible=False)
        cmd.extend(map(str,
                       ['-x',
                        onboard_x,
                        '-y', onboard_y,
                        '-s',
                        '{}x{}'.format(onboard_width, onboard_height)]))
        self.app = ManagedApplication(cmd, window=window)
Пример #5
0
    def _create_mplayer(self, mplayer_id, incoming_mplayer):
        """
        Start a ManagedApplication instance according to the details in the
        media argument and return process instance, FIFO file (full path) to
        drive the mplayer application and resource URL.

        """
        fifo_path = self._create_fifo(mplayer_id)
        geometry = WindowGeometry(x=incoming_mplayer.geometry.x,
                                  y=incoming_mplayer.geometry.y,
                                  width=incoming_mplayer.geometry.width,
                                  height=incoming_mplayer.geometry.height)

        mplayer_window = ManagedWindow(geometry=geometry,
                                       w_instance=str(mplayer_id),
                                       w_class="MPlayer")

        if incoming_mplayer.on_finish == "nothing" or incoming_mplayer.on_finish == "close":
            respawn = False
        else:
            respawn = True
        mplayer = ManagedMplayer(fifo_path=fifo_path,
                                 url=incoming_mplayer.url,
                                 slug=mplayer_id,
                                 window=mplayer_window,
                                 respawn=respawn)

        mplayer.set_state(ApplicationState.VISIBLE)

        rospy.logdebug(
            "MPlayer Pool: started new mplayer instance %s on viewport %s with id %s"
            % (self.viewport_name, incoming_mplayer, mplayer_id))
        self.mplayers[mplayer_id] = mplayer

        return True
    def setUp(self):
        """
        - instantiate ManagedMplayer
        - run asserts on object's parameters
        """

        self.width = 1000
        self.height = 1001
        self.x = 1002
        self.y = 1003
        self.slug = 'testing_slug'
        self.url = 'http://lg-head/lg/assets/videos/bunny.mp4'
        self.fifo_path = '/tmp/asd_lol'
        self.cmd = '-idle -slave'

        self.geometry = WindowGeometry(width=self.width,
                                       height=self.height,
                                       x=self.x,
                                       y=self.y)

        self.window = ManagedWindow(
            geometry=self.geometry,
            w_instance="Mplayer \\({}\\)".format(self.slug),
            w_class="Mplayer \\({}\\)".format(self.slug))

        self.mam = ManagedMplayer(window=self.window,
                                  fifo_path=self.fifo_path,
                                  slug=self.slug,
                                  url=self.url)

        super(ManagedMplayer, self.mam).__init__(cmd=self.cmd,
                                                 window=self.window)
        rospy.logdebug("This is mam: %s" % self.mam.__dict__)
Пример #7
0
 def _get_browser_window_geometry(self, adhoc_browser_msg):
     """
     accepts AdhocBrowser message and returns WindowGeometry class instance
     """
     return WindowGeometry(x=adhoc_browser_msg.geometry.x,
                           y=adhoc_browser_msg.geometry.y,
                           width=adhoc_browser_msg.geometry.width,
                           height=adhoc_browser_msg.geometry.height)
Пример #8
0
def combine_viewport_geometries(viewport_names):
    geometries = [ManagedWindow.lookup_viewport_geometry(v) for v in viewport_names]

    combined = WindowGeometry(
        x=geometries[0].x,
        y=geometries[0].y,
        width=geometries[0].width,
        height=geometries[0].height
    )

    for geometry in geometries:
        combined.x = min(combined.x, geometry.x)
        combined.y = min(combined.y, geometry.y)
        combined.width = max(combined.width, geometry.x - combined.x + geometry.width)
        combined.height = max(combined.height, geometry.y - combined.y + geometry.height)

    return combined
 def _get_viewport_offset(self):
     """
     Adhoc browser needs geometry that's honoring viewport offsets
     This method will add viewport offset
     """
     viewport_geometry = ManagedWindow.get_viewport_geometry()
     if not viewport_geometry:
         viewport_geometry = WindowGeometry()
     return {'x': viewport_geometry.x, 'y': viewport_geometry.y}
Пример #10
0
    def _get_viewport_offset(self):
        """
        Director messages contain offset and size local to the screen that media
        should be displayed on.
        Screens have their own offsets that should be honored during ManagedWindow creation.
        This method will return `real` offset.

        """
        viewport_geometry = ManagedWindow.get_viewport_geometry()
        if not viewport_geometry:
            viewport_geometry = WindowGeometry()
        return {'x': viewport_geometry.x, 'y': viewport_geometry.y}
Пример #11
0
 def _instantiate_player(self, window, instance_name):
     geometry = WindowGeometry(width=window['width'],
                               height=window['height'],
                               x=self.geometry.x + window['x_coord'],
                               y=self.geometry.y + window['y_coord'])
     conf = window.get('activity_config', {})
     source_viewport = conf.get('viewport', '')
     source_viewport = source_viewport.replace('viewport://', '')
     rospy.loginfo("Using geometry for playback: %s" % geometry)
     player = MirrorPlayback(instance_name=instance_name,
                             janus_url=self.janus_url,
                             source_viewport=source_viewport,
                             geometry=geometry)
     return player
Пример #12
0
    def parse_geometry(geometry):
        """
        Parses Xorg window geometry in the form WxH[+-]X[+-]Y

        Raises ValueError if the geometry string is invalid.
        """
        m = re.match(r'^(\d+)x(\d+)([+-]\d+)([+-]\d+)$', geometry)

        if m is None:
            raise ValueError('Invalid window geometry: {}'.format(geometry))

        dims = map(int, m.groups())
        return WindowGeometry(width=dims[0],
                              height=dims[1],
                              x=dims[2],
                              y=dims[3])
Пример #13
0
    def _start_capture(self, window):
        # Find dimensions that fit in the destination window,
        # while preserving the source aspect ratio.
        target_geometry = WindowGeometry(x=window['x_coord'],
                                         y=window['y_coord'],
                                         width=window['width'],
                                         height=window['height'])
        target_width, target_height = aspect_scale_source(
            target_geometry, self.geometry)

        # If we were already capturing for this target, NOP.
        if (self._gst is not None and self._previous_width == target_width
                and self._previous_height == target_height):
            return
        # Otherwise, continue exclusively.
        self._end_capture()

        self._previous_width = target_width
        self._previous_height = target_height

        pipeline = ' '.join(
            map(
                lambda arg: arg.format(
                    startx=self.geometry.x,
                    starty=self.geometry.y,
                    # Subtract 1 from width/height to workaround gstreamer wierdness.
                    endx=self.geometry.x + self.geometry.width - 1,
                    endy=self.geometry.y + self.geometry.height - 1,
                    show_pointer=str(self.show_pointer).lower(),
                    framerate=self.framerate,
                    quality=self.quality,
                    target_width=target_width,
                    target_height=target_height,
                    display=self.display),
                CAPTURE_PIPELINE))

        self._gst = GstPublisher(pipeline, self.image_pub)
        self._gst.start()
Пример #14
0
def combine_viewport_geometries(viewport_names):
    geometries = [
        ManagedWindow.lookup_viewport_geometry(v) for v in viewport_names
    ]

    combined = WindowGeometry(x=geometries[0].x,
                              y=geometries[0].y,
                              width=geometries[0].width,
                              height=geometries[0].height)

    for geometry in geometries:
        combined.x = min(combined.x, geometry.x)
        combined.y = min(combined.y, geometry.y)
        combined.width = max(combined.width,
                             geometry.x - combined.x + geometry.width)
        combined.height = max(combined.height,
                              geometry.y - combined.y + geometry.height)

    return combined
Пример #15
0
 def test_equality(self):
     sg = WindowGeometry(width=1920, height=1080, x=0, y=0)
     dg = WindowGeometry(width=1920, height=1080, x=0, y=0)
     self.check_dimensions(sg, dg, 1920, 1080)
Пример #16
0
 def test_portrait_to_landscape(self):
     sg = WindowGeometry(width=1080, height=1920, x=0, y=0)
     dg = WindowGeometry(width=1920, height=1080, x=0, y=0)
     expected_width = int(round(1080 / (1920. / 1080.)))
     self.check_dimensions(sg, dg, expected_width, 1080)
Пример #17
0
 def test_scale_up_landscape_to_portrait(self):
     sg = WindowGeometry(width=1920, height=1080, x=0, y=0)
     dg = WindowGeometry(width=2160, height=3840, x=0, y=0)
     # Should never scale larger than source geometry.
     self.check_dimensions(sg, dg, 1920, 1080)
Пример #18
0
 def test_scale_down_landscape_to_portrait(self):
     sg = WindowGeometry(width=3840, height=2160, x=0, y=0)
     dg = WindowGeometry(width=1080, height=1920, x=0, y=0)
     expected_height = int(round(1080 / (3840. / 2160.)))
     self.check_dimensions(sg, dg, 1080, expected_height)
Пример #19
0
 def test_scale_down(self):
     sg = WindowGeometry(width=3840, height=2160, x=0, y=0)
     dg = WindowGeometry(width=1920, height=1080, x=0, y=0)
     self.check_dimensions(sg, dg, 1920, 1080)