Signed-off-by: Lucas Meneghel Rodrigues <[email protected]>
---
 client/virt/env_process.py      |   4 +-
 client/virt/video_maker.py      | 224 ++++++++++++++++++++++++++++++++++++++++
 client/virt/virt_video_maker.py | 224 ----------------------------------------
 3 files changed, 226 insertions(+), 226 deletions(-)
 create mode 100644 client/virt/video_maker.py
 delete mode 100644 client/virt/virt_video_maker.py

diff --git a/client/virt/env_process.py b/client/virt/env_process.py
index 5e5e70c..6f9b2c0 100644
--- a/client/virt/env_process.py
+++ b/client/virt/env_process.py
@@ -2,7 +2,7 @@ import os, time, commands, re, logging, glob, threading, shutil
 from autotest.client import utils
 from autotest.client.shared import error
 import aexpect, kvm_monitor, ppm_utils, test_setup, virt_vm, kvm_vm
-import libvirt_vm, virt_video_maker, virt_utils, storage, kvm_storage
+import libvirt_vm, video_maker, virt_utils, storage, kvm_storage
 import remote, ovirt
 
 try:
@@ -171,7 +171,7 @@ def postprocess_vm(test, params, env, name):
                       "encode a video from the screenshots produced by "
                       "vm %s", vm.name)
         try:
-            video = virt_video_maker.GstPythonVideoMaker()
+            video = video_maker.GstPythonVideoMaker()
             if (video.has_element('vp8enc') and video.has_element('webmmux')):
                 video_file = os.path.join(test.debugdir, "%s-%s.webm" %
                                           (vm.name, test.iteration))
diff --git a/client/virt/video_maker.py b/client/virt/video_maker.py
new file mode 100644
index 0000000..7770422
--- /dev/null
+++ b/client/virt/video_maker.py
@@ -0,0 +1,224 @@
+"""
+Video Maker transforms screenshots taken during a test into a HTML 5
+compatible video, so that one can watch the screen activity of the
+whole test from inside your own browser.
+
+This relies on generally available multimedia libraries, frameworks
+and tools.
+"""
+
+
+import os, time, glob, logging
+
+
+__all__ = ['GstPythonVideoMaker', 'video_maker']
+
+
+#
+# Check what kind of video libraries tools we have available
+#
+# Gstreamer python bindings are our first choice
+try:
+    import gst
+    GST_PYTHON_INSTALLED = True
+except ImportError:
+    GST_PYTHON_INSTALLED = False
+
+
+#
+# PIL is also required to normalize images
+#
+try:
+    import PIL.Image
+    PIL_INSTALLED = True
+except ImportError:
+    PIL_INSTALLED = False
+
+
+#
+# We only do video
+#
+CONTAINER_PREFERENCE = ['ogg', 'webm']
+ENCODER_PREFERENCE = ['theora', 'vp8']
+
+
+class GstPythonVideoMaker(object):
+    '''
+    Makes a movie out of screendump images using gstreamer-python
+    '''
+
+
+    CONTAINER_MAPPING = {'ogg' : 'oggmux',
+                         'webm' : 'webmmux'}
+
+    ENCODER_MAPPING = {'theora' : 'theoraenc',
+                       'vp8' : 'vp8enc'}
+
+    CONTAINER_ENCODER_MAPPING = {'ogg' : 'theora',
+                                 'webm' : 'vp8'}
+
+
+    def __init__(self, verbose=False):
+        if not GST_PYTHON_INSTALLED:
+            raise ValueError('gstreamer-python library was not found')
+        if not PIL_INSTALLED:
+            raise ValueError('python-imaging library was not found')
+
+        self.verbose = verbose
+
+
+    def get_most_common_image_size(self, input_dir):
+        '''
+        Find the most common image size
+        '''
+        image_sizes = {}
+        image_files = glob.glob(os.path.join(input_dir, '*.jpg'))
+        for f in image_files:
+            i = PIL.Image.open(f)
+            if not image_sizes.has_key(i.size):
+                image_sizes[i.size] = 1
+            else:
+                image_sizes[i.size] += 1
+
+        most_common_size_counter = 0
+        most_common_size = None
+        for image_size, image_counter in image_sizes.items():
+            if image_counter > most_common_size_counter:
+                most_common_size_counter = image_counter
+                most_common_size = image_size
+        return most_common_size
+
+
+    def normalize_images(self, input_dir):
+        '''
+        GStreamer requires all images to be the same size, so we do it here
+        '''
+        image_size = self.get_most_common_image_size(input_dir)
+        if image_size is None:
+            image_size = (800, 600)
+
+        if self.verbose:
+            logging.debug('Normalizing image files to size: %s', image_size)
+        image_files = glob.glob(os.path.join(input_dir, '*.jpg'))
+        for f in image_files:
+            i = PIL.Image.open(f)
+            if i.size != image_size:
+                i.resize(image_size).save(f)
+
+
+    def has_element(self, kind):
+        '''
+        Returns True if a gstreamer element is available
+        '''
+        return gst.element_factory_find(kind) is not None
+
+
+    def get_container_name(self):
+        '''
+        Gets the video container available that is the best based on preference
+        '''
+        for c in CONTAINER_PREFERENCE:
+            element_kind = self.CONTAINER_MAPPING.get(c, c)
+            if self.has_element(element_kind):
+                return element_kind
+
+        raise ValueError('No suitable container format was found')
+
+
+    def get_encoder_name(self):
+        '''
+        Gets the video encoder available that is the best based on preference
+        '''
+        for c in ENCODER_PREFERENCE:
+            element_kind = self.ENCODER_MAPPING.get(c, c)
+            if self.has_element(element_kind):
+                return element_kind
+
+        raise ValueError('No suitable encoder format was found')
+
+
+    def get_element(self, name):
+        '''
+        Makes and returns and element from the gst factory interface
+        '''
+        if self.verbose:
+            logging.debug('GStreamer element requested: %s', name)
+        return gst.element_factory_make(name, name)
+
+
+    def start(self, input_dir, output_file):
+        '''
+        Process the input files and output the video file
+        '''
+        self.normalize_images(input_dir)
+        no_files = len(glob.glob(os.path.join(input_dir, '*.jpg')))
+        if self.verbose:
+            logging.debug('Number of files to encode as video: %s', no_files)
+
+        pipeline = gst.Pipeline("pipeline")
+
+        source = self.get_element("multifilesrc")
+        source_location = os.path.join(input_dir, "%04d.jpg")
+        if self.verbose:
+            logging.debug("Source location: %s", source_location)
+        source.set_property('location', source_location)
+        source.set_property('index', 1)
+        source_caps = gst.Caps()
+        source_caps.append('image/jpeg,framerate=(fraction)4/1')
+        source.set_property('caps', source_caps)
+
+        decoder = self.get_element("jpegdec")
+
+        # Attempt to auto detect the chosen encoder/mux based on output_file
+        encoder = None
+        container = None
+
+        for container_name in self.CONTAINER_ENCODER_MAPPING:
+            if output_file.endswith('.%s' % container_name):
+
+                enc_name = self.CONTAINER_ENCODER_MAPPING[container_name]
+                enc_name_gst = self.ENCODER_MAPPING[enc_name]
+                encoder = self.get_element(enc_name_gst)
+
+                cont_name_gst = self.CONTAINER_MAPPING[container_name]
+                container = self.get_element(cont_name_gst)
+
+        # If auto detection fails, choose from the list of preferred codec/mux
+        if encoder is None:
+            encoder = self.get_element(self.get_encoder_name())
+        if container is None:
+            container = self.get_element(self.get_container_name())
+
+        output = self.get_element("filesink")
+        output.set_property('location', output_file)
+
+        pipeline.add_many(source, decoder, encoder, container, output)
+        gst.element_link_many(source, decoder, encoder, container, output)
+
+        pipeline.set_state(gst.STATE_PLAYING)
+        while True:
+            if source.get_property('index') <= no_files:
+                if self.verbose:
+                    logging.debug("Currently processing image number: %s",
+                                  source.get_property('index'))
+                time.sleep(1)
+            else:
+                break
+        time.sleep(3)
+        pipeline.set_state(gst.STATE_NULL)
+
+
+def video_maker(input_dir, output_file):
+    '''
+    Instantiates and runs a video maker
+    '''
+    v = GstPythonVideoMaker()
+    v.start(input_dir, output_file)
+
+
+if __name__ == '__main__':
+    import sys
+    if len(sys.argv) < 3:
+        print 'Usage: %s <input_dir> <output_file>' % sys.argv[0]
+    else:
+        video_maker(sys.argv[1], sys.argv[2])
diff --git a/client/virt/virt_video_maker.py b/client/virt/virt_video_maker.py
deleted file mode 100644
index 7770422..0000000
--- a/client/virt/virt_video_maker.py
+++ /dev/null
@@ -1,224 +0,0 @@
-"""
-Video Maker transforms screenshots taken during a test into a HTML 5
-compatible video, so that one can watch the screen activity of the
-whole test from inside your own browser.
-
-This relies on generally available multimedia libraries, frameworks
-and tools.
-"""
-
-
-import os, time, glob, logging
-
-
-__all__ = ['GstPythonVideoMaker', 'video_maker']
-
-
-#
-# Check what kind of video libraries tools we have available
-#
-# Gstreamer python bindings are our first choice
-try:
-    import gst
-    GST_PYTHON_INSTALLED = True
-except ImportError:
-    GST_PYTHON_INSTALLED = False
-
-
-#
-# PIL is also required to normalize images
-#
-try:
-    import PIL.Image
-    PIL_INSTALLED = True
-except ImportError:
-    PIL_INSTALLED = False
-
-
-#
-# We only do video
-#
-CONTAINER_PREFERENCE = ['ogg', 'webm']
-ENCODER_PREFERENCE = ['theora', 'vp8']
-
-
-class GstPythonVideoMaker(object):
-    '''
-    Makes a movie out of screendump images using gstreamer-python
-    '''
-
-
-    CONTAINER_MAPPING = {'ogg' : 'oggmux',
-                         'webm' : 'webmmux'}
-
-    ENCODER_MAPPING = {'theora' : 'theoraenc',
-                       'vp8' : 'vp8enc'}
-
-    CONTAINER_ENCODER_MAPPING = {'ogg' : 'theora',
-                                 'webm' : 'vp8'}
-
-
-    def __init__(self, verbose=False):
-        if not GST_PYTHON_INSTALLED:
-            raise ValueError('gstreamer-python library was not found')
-        if not PIL_INSTALLED:
-            raise ValueError('python-imaging library was not found')
-
-        self.verbose = verbose
-
-
-    def get_most_common_image_size(self, input_dir):
-        '''
-        Find the most common image size
-        '''
-        image_sizes = {}
-        image_files = glob.glob(os.path.join(input_dir, '*.jpg'))
-        for f in image_files:
-            i = PIL.Image.open(f)
-            if not image_sizes.has_key(i.size):
-                image_sizes[i.size] = 1
-            else:
-                image_sizes[i.size] += 1
-
-        most_common_size_counter = 0
-        most_common_size = None
-        for image_size, image_counter in image_sizes.items():
-            if image_counter > most_common_size_counter:
-                most_common_size_counter = image_counter
-                most_common_size = image_size
-        return most_common_size
-
-
-    def normalize_images(self, input_dir):
-        '''
-        GStreamer requires all images to be the same size, so we do it here
-        '''
-        image_size = self.get_most_common_image_size(input_dir)
-        if image_size is None:
-            image_size = (800, 600)
-
-        if self.verbose:
-            logging.debug('Normalizing image files to size: %s', image_size)
-        image_files = glob.glob(os.path.join(input_dir, '*.jpg'))
-        for f in image_files:
-            i = PIL.Image.open(f)
-            if i.size != image_size:
-                i.resize(image_size).save(f)
-
-
-    def has_element(self, kind):
-        '''
-        Returns True if a gstreamer element is available
-        '''
-        return gst.element_factory_find(kind) is not None
-
-
-    def get_container_name(self):
-        '''
-        Gets the video container available that is the best based on preference
-        '''
-        for c in CONTAINER_PREFERENCE:
-            element_kind = self.CONTAINER_MAPPING.get(c, c)
-            if self.has_element(element_kind):
-                return element_kind
-
-        raise ValueError('No suitable container format was found')
-
-
-    def get_encoder_name(self):
-        '''
-        Gets the video encoder available that is the best based on preference
-        '''
-        for c in ENCODER_PREFERENCE:
-            element_kind = self.ENCODER_MAPPING.get(c, c)
-            if self.has_element(element_kind):
-                return element_kind
-
-        raise ValueError('No suitable encoder format was found')
-
-
-    def get_element(self, name):
-        '''
-        Makes and returns and element from the gst factory interface
-        '''
-        if self.verbose:
-            logging.debug('GStreamer element requested: %s', name)
-        return gst.element_factory_make(name, name)
-
-
-    def start(self, input_dir, output_file):
-        '''
-        Process the input files and output the video file
-        '''
-        self.normalize_images(input_dir)
-        no_files = len(glob.glob(os.path.join(input_dir, '*.jpg')))
-        if self.verbose:
-            logging.debug('Number of files to encode as video: %s', no_files)
-
-        pipeline = gst.Pipeline("pipeline")
-
-        source = self.get_element("multifilesrc")
-        source_location = os.path.join(input_dir, "%04d.jpg")
-        if self.verbose:
-            logging.debug("Source location: %s", source_location)
-        source.set_property('location', source_location)
-        source.set_property('index', 1)
-        source_caps = gst.Caps()
-        source_caps.append('image/jpeg,framerate=(fraction)4/1')
-        source.set_property('caps', source_caps)
-
-        decoder = self.get_element("jpegdec")
-
-        # Attempt to auto detect the chosen encoder/mux based on output_file
-        encoder = None
-        container = None
-
-        for container_name in self.CONTAINER_ENCODER_MAPPING:
-            if output_file.endswith('.%s' % container_name):
-
-                enc_name = self.CONTAINER_ENCODER_MAPPING[container_name]
-                enc_name_gst = self.ENCODER_MAPPING[enc_name]
-                encoder = self.get_element(enc_name_gst)
-
-                cont_name_gst = self.CONTAINER_MAPPING[container_name]
-                container = self.get_element(cont_name_gst)
-
-        # If auto detection fails, choose from the list of preferred codec/mux
-        if encoder is None:
-            encoder = self.get_element(self.get_encoder_name())
-        if container is None:
-            container = self.get_element(self.get_container_name())
-
-        output = self.get_element("filesink")
-        output.set_property('location', output_file)
-
-        pipeline.add_many(source, decoder, encoder, container, output)
-        gst.element_link_many(source, decoder, encoder, container, output)
-
-        pipeline.set_state(gst.STATE_PLAYING)
-        while True:
-            if source.get_property('index') <= no_files:
-                if self.verbose:
-                    logging.debug("Currently processing image number: %s",
-                                  source.get_property('index'))
-                time.sleep(1)
-            else:
-                break
-        time.sleep(3)
-        pipeline.set_state(gst.STATE_NULL)
-
-
-def video_maker(input_dir, output_file):
-    '''
-    Instantiates and runs a video maker
-    '''
-    v = GstPythonVideoMaker()
-    v.start(input_dir, output_file)
-
-
-if __name__ == '__main__':
-    import sys
-    if len(sys.argv) < 3:
-        print 'Usage: %s <input_dir> <output_file>' % sys.argv[0]
-    else:
-        video_maker(sys.argv[1], sys.argv[2])
-- 
1.7.11.2

_______________________________________________
Autotest-kernel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/autotest-kernel

Reply via email to