class IAnalyzer(Interface):
"""Media item analyzer driver interface"""
+ @staticmethod
def id():
"""Return a short id alphanumeric, lower-case string."""
+ @staticmethod
def name():
"""Return the analyzer name, such as "Mean Level", "Max level",
"Total length, etc..
"""
+ @staticmethod
def unit():
"""Return the unit of the data such as "dB", "seconds", etc...
"""
- def render(media, options=None):
+ def render(self, media, options=None):
"""Return the result data of the process"""
class IDecoder(Interface):
"""Decoder driver interface"""
- # Remark: the method prototypes do not include any self or cls argument
- # because an interface is meant to show what methods a class must expose
- # from the caller's point of view. However, when implementing the class
- # you'll obviously want to include this extra argument.
-
+ @staticmethod
def format():
"""Return the decode/encoding format as a short string
Example: "MP3", "OGG", "AVI", ...
"""
+ @staticmethod
def description():
"""Return a string describing what this decode format provides, is good
for, etc... The description is meant to help the end user decide what
format is good for him/her
"""
+ @staticmethod
def file_extension():
"""Return the filename extension corresponding to this decode format"""
+ @staticmethod
def mime_type():
"""Return the mime type corresponding to this decode format"""
- def process(source, options=None):
+ def process(self, source, options=None):
"""Perform the decoding process and stream the result through a generator
source is the audio/video source file absolute path.
class IEncoder(Interface):
"""Encoder driver interface"""
- # Remark: the method prototypes do not include any self or cls argument
- # because an interface is meant to show what methods a class must expose
- # from the caller's point of view. However, when implementing the class
- # you'll obviously want to include this extra argument.
-
- # FIXME: this constructor conflicts with the core component architecture
- def __init__(output, nchannels, samplerate):
+ def __init__(self, output, nchannels, samplerate):
"""The constructor must always accept the output, nchannels and samplerate
arguments. It may accepts extra arguments such as bitrate, depth, etc..,
but these must be optionnal, that is have a default value.
block of binary data.
"""
+ @staticmethod
def format():
"""Return the encode/encoding format as a short string
Example: "MP3", "OGG", "AVI", ...
"""
+ @staticmethod
def description():
"""Return a string describing what this encode format provides, is good
for, etc... The description is meant to help the end user decide what
format is good for him/her
"""
+ @staticmethod
def file_extension():
"""Return the filename extension corresponding to this encode format"""
+ @staticmethod
def mime_type():
"""Return the mime type corresponding to this encode format"""
- def set_metadata(metadata):
+ def set_metadata(self, metadata):
"""metadata is a tuple containing tuples for each descriptor return by
the dc.Ressource of the item, in the model order :
((name1, value1),(name2, value2),(name1, value3), ...)"""
- def update():
+ def update(self):
"""Updates the metadata into the file passed as the output argument
to the constructor. This method can't be called in streaming
mode."""
- def process(frames):
+ def process(self, frames):
"""Encode the frames passed as a numpy array, where columns are channels.
In streaming mode the callback passed to the constructor is called whenever
a block of encoded data is ready."""
- def finish():
+ def finish(self):
"""Flush the encoded data and close the output file/stream. Calling this method
may cause the streaming callback to be called if in streaming mode."""
class IGrapher(Interface):
"""Media item visualizer driver interface"""
+ @staticmethod
def id():
"""Return a short id alphanumeric, lower-case string."""
+ @staticmethod
def name():
"""Return the graph name, such as "Waveform", "Spectral view",
etc..
and scheme a a predefined color theme name"""
pass
- def render(media_item, width=None, height=None, options=None):
+ def render(self, media_item, width=None, height=None, options=None):
"""Generator that streams the graph output as a PNG image"""
for analyzer_class in self.analyzers:
# FIXME: should access the name, id and unit member statically
# there should be no need to instantiate analyzer_class
- # eg: access directly analyzer_class.name, etc...
+ # eg: access directly analyzer_class.name(), etc...
#
# This remark is true at many places in this file
analyzer = analyzer_class()