#!/usr/bin/env python
import argparse
import os
import motmot.FlyMovieFormat.FlyMovieFormat as FMFMod
import numpy as np

def pvn2fmf(in_fname=None):
    fd = open(in_fname,mode='r')
    magic = fd.readline().strip()
    if magic=='PV5a':
        format = 'MONO8'
        fmf_bpp=8
    elif magic=='PV6a':
        format = 'RGB8'
        fmf_bpp=24
    else:
        raise ValueError('unknown PVN magic string "%s"'%magic)
    width, height, depth = map(int,fd.readline().strip().split())
    bpp_str, framerate_str = fd.readline().strip().split()
    bpp = int(bpp_str)
    framerate = float(framerate_str)

    bytes_per_frame = width*height*fmf_bpp/8
    if format=='MONO8':
        shape=(height,width)
    else:
        shape=(height,width,3)

    fmf_fname = os.path.splitext(in_fname)[0] + '.fmf'
    fmf_out = FMFMod.FlyMovieSaver(fmf_fname,
                                   version=3,
                                   format=format,
                                   bits_per_pixel=fmf_bpp)
    timestamp = 0.0
    dt = 1.0/framerate
    while 1:
        buf = fd.read( bytes_per_frame )
        if len(buf) != bytes_per_frame:
            break
        frame = np.fromstring(buf,dtype=np.uint8)
        frame.shape = shape
        fmf_out.add_frame( frame, timestamp )
        timestamp += dt
    fmf_out.close()

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument(
        'pvn', metavar='pvn', help='the .pvn file to be converted')
    args = parser.parse_args()
    pvn2fmf(in_fname = args.pvn)
