# Copyright 2019 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from .gst import *

def decoded_file_src(filename):
    return [
        Source('file', location=filename),
        #Filter('decodebin'),
        Filter('videoparse width=960 height=540 format=4'),
        Caps('video/x-raw,framerate=25/1'),
        Filter('videoconvert'),
        Caps('video/x-raw,format=I420'),
        Filter('glfilterbin filter=glcolorscale'),
        Caps('video/x-raw,width=1280,height=720,format=BGRA'),
    ]

#TODO: Remove this function when video codec is available
def decoded_img_file_src(filename):
    return [
        Source('file', location=filename),
        Filter('decodebin'),
        Filter('videoconvert'),
        Caps('video/x-raw,format=I420'),
        Filter('glfilterbin filter=glcolorscale'),
        Caps('video/x-raw,height=720,format=BGRA'),
    ]

def v4l2_src(fmt):
    return [
        Source('v4l2', device=fmt.device),
        # TODO: use YUV input when MIPI camera is ready
        Caps('image/jpeg', width=fmt.size.width, height=fmt.size.height,
             framerate='%d/%d' % fmt.framerate),
        Filter('decodebin'),
        Filter('glfilterbin filter=glcolorscale'),
        Caps('video/x-raw', height=720, format='BGRA'),
    ]

def display_sink():
    return [
        Filter('rsvgoverlay', name='svg_overlay'),
        Sink('wayland', name='glsink', sync=False)
    ]

def h264_sink():
    return Sink('app', name='h264sink', emit_signals=True, max_buffers=1, drop=False, sync=False)

def inference_pipeline(layout, stillimage=False):
    size = max_inner_size(layout.render_size, layout.inference_size)
    return [
        Filter('v4l2convert'),
        Caps('video/x-raw,format=RGB,width=%d,height=%d,pixel-aspect-ratio=1/1' % (
            layout.inference_size.width, layout.inference_size.height)),
        Sink('app', name='appsink', emit_signals=True, max_buffers=1, drop=True, sync=False),
    ]

# Display
def image_display_pipeline(filename, layout):
    return (
        [decoded_img_file_src(filename),
         Filter('videoconvert'),
         Filter('imagefreeze'),
         Caps('video/x-raw', framerate='30/1'),
         Tee(name='t')],
        [Pad('t'),
         Queue(),
         display_sink()],
        [Pad('t'),
         Queue(max_size_buffers=1, leaky='downstream'),
         inference_pipeline(layout)],
    )


def video_display_pipeline(filename, layout):
    return (
        [decoded_file_src(filename),
         Tee(name='t')],
        [Pad('t'),
         Queue(),
         display_sink()],
        [Pad('t'),
         Queue(max_size_buffers=1, leaky='downstream'),
         inference_pipeline(layout)],
    )

def camera_display_pipeline(fmt, layout):
    return (
        [v4l2_src(fmt),
         Tee(name='t')],
        [Pad('t'),
         Queue(max_size_buffers=1, leaky='downstream'),
         display_sink()],
        [Pad(name='t'),
         Queue(max_size_buffers=1, leaky='downstream'),
         inference_pipeline(layout)],
    )

# Headless
def image_headless_pipeline(filename, layout):
    return (
      [decoded_img_file_src(filename),
       Filter('videoconvert'),
       Filter('imagefreeze'),
       inference_pipeline(layout)],
    )

def video_headless_pipeline(filename, layout):
    return (
        [decoded_file_src(filename),
         inference_pipeline(layout)],
    )

def camera_headless_pipeline(fmt, layout):
    return (
        [v4l2_src(fmt),
         inference_pipeline(layout)],
    )

# Streaming
def video_streaming_pipeline(filename, layout):
    return (
        [Source('file', location=filename),
         Filter('qtdemux'),
         Tee(name='t')],
        [Pad('t'),
         Queue(max_size_buffers=1),
         Filter('h264parse'),
         Caps('video/x-h264', stream_format='byte-stream', alignment='nal'),
         h264_sink()],
        [Pad('t'),
         Queue(max_size_buffers=1),
         Filter('decodebin'),
         inference_pipeline(layout)],
    )

def camera_streaming_pipeline(fmt, profile, bitrate, layout):
    return (
        [v4l2_src(fmt), Tee(name='t')],
        [Pad('t'),
         Queue(max_size_buffers=1, leaky='downstream'),
         Filter('videoconvert'),
         Filter('x264enc',
                 speed_preset='ultrafast',
                 tune='zerolatency',
                 threads=4,
                 key_int_max=5,
                 bitrate=int(bitrate / 1000),  # kbit per second.
                 aud=False),
          Caps('video/x-h264', profile=profile),
          Filter('h264parse'),
          Caps('video/x-h264', stream_format='byte-stream', alignment='nal'),
          h264_sink()],
        [Pad('t'),
         Queue(),
         inference_pipeline(layout)],
    )
