Command Line

#!/usr/bin/python -u
##==========================================================================
##
##  Copyright (c) On2 Technologies Inc. All Rights Reserved.
##
##--------------------------------------------------------------------------
##
##  File:        $Workfile$
##               $Revision$
##
##  Last Update: $DateUTC$
##
##--------------------------------------------------------------------------
##
import flixengine2
import time,sys,os

#checks the return value of an API function printing error information on
#failure. usage checksc(funcname,sc)
def checksc(func, sc):
    if (sc != flixengine2.ON2_OK):
        print "%s failed: sc= %d" % (func,sc)

        #if sc == ON2_NET_ERROR Flix2_Errno will return the specific rpc error
        #encountered as flixerrno along with the client lib's errno value
        if (sc == flixengine2.ON2_NET_ERROR): str = "rpcerr";
        else: str = "flixerrno";

        res = flixengine2.Flix2_Errno(flix)
        print " Flix2_Errno: sc:%d %s:%d syserrno:%d\n" %\
            (res[0],str,res[1],res[2])
        raise Exception(func)

def print_encoder_status():
    print "\nEncoder Status"

    res = flixengine2.Flix2_GetEncoderState(flix)
    print " Flix2_GetEncoderState: %d" % res[1]

    res = flixengine2.Flix2_Errno(flix)
    print " Flix2_Errno: sc:%d flixerrno:%d syserrno:%d\n" %\
        (res[0],res[1],res[2])

print "Flix Engine client library v%s" % flixengine2.Flix2_Version()
print "%s\n" % flixengine2.Flix2_Copyright()

if (len(sys.argv) < 3):
    print "usage: cli_encode.py <infile> <outfile>\n\n"\
          "NOTE cli_encode.py uses libflixengine2.so which is a client\n"\
          "NOTE side rpc library. All paths must be accessible to the\n"\
          "NOTE server side, i.e., flixd, thus relative paths will most\n"\
          "NOTE likely give undesired results. The same can be said\n"\
          "NOTE for clients running on different machines.\n"
    raise Exception()

timeout_s = 0 #rpc timeout in seconds, 0=use default (25s)

flixptr = flixengine2.new_flix2handlep()
sc = flixengine2.Flix2_CreateEx(flixptr, "localhost", timeout_s)

# retrieve the actual flix handle for use in the remaining API calls
flix = flixengine2.flix2handlep_value(flixptr);\
  checksc('flixengine2.Flix2_CreateEx',sc)

print "Input File  : %s" % sys.argv[1]
if(os.path.isabs(sys.argv[1])!=True):
    print "WARNING: path to input file is not absolute"
sc = flixengine2.Flix2_SetInputFile(flix, sys.argv[1]);\
  checksc('flixengine2.Flix2_SetInputFile',sc)

##input file information
srcw = flixengine2.video_options_GetSourceWidth(flix);\
  checksc('flixengine2.video_options_GetSourceWidth',srcw[0])
srch = flixengine2.video_options_GetSourceHeight(flix);\
  checksc('flixengine2.video_options_GetSourceHeight',srch[0])
srcduration = flixengine2.Flix2_GetSourceDuration(flix);\
  checksc('flixengine2.Flix2_GetSourceDuration)',srcduration[0])
print "              Width:    %d\n" \
      "              Height:   %d\n" \
      "              Duration: %dms" % \
    (srcw[1],srch[1],srcduration[1])

print "Output File : %s" % sys.argv[2]
if(os.path.isabs(sys.argv[2])!=True):
    print "WARNING: path to output file is not absolute"
sc = flixengine2.Flix2_SetOutputFile(flix, sys.argv[2]);\
  checksc('flixengine2.Flix2_SetOutputFile',sc)

##
## Options may be set and codecs/filters/muxers may be added prior to Flix2_Encode()
##

##Add the scale filter
##create a storage location for the filter handle
#filterptr= flixengine2.new_flix2plgnhandlep()
#sc = flixengine2.Flix2_AddFilter(filterptr,
#        flix,flixengine2.FE2_FILTER_SCALE);\
#  checksc('Flix2_AddFilter(FE2_FILTER_SCALE)',sc)
#
##retrieve the value of the handle for use in the remaining filter functions
#filter= flixengine2.flix2plgnhandlep_value(filterptr)
#sc = flixengine2.Flix2_FilterSetParam(filter,
#         flixengine2.FE2_SCALE_WIDTH,240);\
#  checksc('Flix2_FilterSetParam(FE2_SCALE_WIDTH,240)',sc)
#sc = flixengine2.Flix2_FilterSetParam(filter,
#         flixengine2.FE2_SCALE_HEIGHT,160);\
#  checksc('Flix2_FilterSetParam(FE2_SCALE_HEIGHT,160)',sc)
#
##cleanup
#flixengine2.delete_flix2plgnhandlep(filterptr); filterptr= None
#
##Add the vp6 codec. Though it is the default, you must add it in order
##to modify its settings
#codecptr= flixengine2.new_flix2plgnhandlep()
#sc = flixengine2.Flix2_AddCodec(codecptr,flix,flixengine2.FE2_CODEC_VP6);\
#  checksc('Flix2_AddCodec(FE2_CODEC_VP6)',sc)
#
##retrieve the value of the handle for use in the remaining codec functions
#codec= flixengine2.flix2plgnhandlep_value(codecptr)
#
#sc = flixengine2.Flix2_CodecSetParam(codec,
#         flixengine2.FE2_VP6_RC_MODE,flixengine2.VBR_1PASSControl);\
#  checksc('Flix2_CodecSetParam(FE2_VP6_RC_MODE,VBR_1PASSControl)',sc)
#
##cleanup
#flixengine2.delete_flix2plgnhandlep(codecptr); codecptr= None
#
##Use the FLV muxer (default)
#muxerptr= flixengine2.new_flix2plgnhandlep()
#sc = flixengine2.Flix2_AddMuxer(muxerptr,flix,flixengine2.FE2_MUXER_FLV);\
#  checksc('Flix2_AddMuxer(FE2_MUXER_FLV)',sc)
#
##retrieve the value of the handle for use in the remaining muxer functions
#muxer= flixengine2.flix2plgnhandlep_value(muxerptr)
#
##cleanup
#flixengine2.delete_flix2plgnhandlep(muxerptr); muxerptr= None

sc = flixengine2.Flix2_Encode(flix); checksc('flixengine2.Flix2_Encode',sc)

ier = [0,1]
print
while(ier[1] != 0):
    ier = flixengine2.Flix2_IsEncoderRunning(flix);\
      checksc('flixengine2.Flix2_IsEncoderRunning',ier[0])

    pcnt = flixengine2.encoding_status_PercentComplete(flix);\
      checksc('flixengine2.encoding_status_PercentComplete',pcnt[0])
    print "\rEncoding...%d%%  " % pcnt[1],
    sys.stdout.flush();

    time.sleep(1)

print "Done!"
print_encoder_status()

#cleanup
sc = flixengine2.Flix2_Destroy(flix); checksc('flixengine2.Flix2_Destroy',sc)
flixengine2.delete_flix2handlep(flixptr)

On2 Technologies, Inc Flix Engine Linux documentation, generated on Tue Nov 2 16:53:00 2010 by doxygen 1.5.5