test
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 01dd5bd..37aa601 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -220,6 +220,7 @@
 
 add_executable(getvideo src/getvideo_main.cpp)
 target_link_libraries(getvideo ${CMAKE_THREAD_LIBS_INIT})
+target_link_libraries(getvideo g3logger)
 
 # Visual Studio Code helper
 # this needs to be at the end to make sure all includes are handled correctly
diff --git a/include/aspeed/JTABLES.H b/include/aspeed/JTABLES.H
index 24e9c55..93fec8c 100644
--- a/include/aspeed/JTABLES.H
+++ b/include/aspeed/JTABLES.H
@@ -1,8 +1,4 @@
 

-#include <stdio.h>

-#include <stdlib.h>

-#include <string.h>

-

 static unsigned char zigzag[64] = {

     0,  1,  5,  6,  14, 15, 27, 28, 2,  4,  7,  13, 16, 26, 29, 42,

     3,  8,  12, 17, 25, 30, 41, 43, 9,  11, 18, 24, 31, 40, 44, 53,

diff --git a/include/ast_jpeg_decoder.hpp b/include/ast_jpeg_decoder.hpp
index e7b36dc..2e0a9b6 100644
--- a/include/ast_jpeg_decoder.hpp
+++ b/include/ast_jpeg_decoder.hpp
@@ -6,8 +6,11 @@
 #include <cassert>
 #include <cstdint>
 #include <iostream>
+#include <string.h>
 #include <vector>
+#include <g3log/g3log.hpp>
 
+/*
 template <class T, class Compare>
 constexpr const T &clamp(const T &v, const T &lo, const T &hi, Compare comp) {
   return assert(!comp(hi, lo)), comp(v, lo) ? lo : comp(hi, v) ? hi : v;
@@ -17,10 +20,20 @@
 constexpr const T &clamp(const T &v, const T &lo, const T &hi) {
   return clamp(v, lo, hi, std::less<>());
 }
-
+*/
 namespace AstVideo {
 
 struct COLOR_CACHE {
+  COLOR_CACHE() {
+    for (int i = 0; i < 4; i++) {
+      Index[i] = i;
+    }
+    Color[0] = 0x008080;
+    Color[1] = 0xFF8080;
+    Color[2] = 0x808080;
+    Color[3] = 0xC08080;
+  }
+
   unsigned long Color[4];
   unsigned char Index[4];
   unsigned char BitMapBits;
@@ -68,6 +81,13 @@
       r.B = 0x00;
       r.Reserved = 0xAA;
     }
+
+    int qfactor = 16;
+
+    SCALEFACTOR = qfactor;
+    SCALEFACTORUV = qfactor;
+    ADVANCESCALEFACTOR = 16;
+    ADVANCESCALEFACTORUV = 16;
     init_jpg_table();
   }
 
@@ -540,9 +560,9 @@
           pYUV[n].B = cb;
           pYUV[n].G = y;
           pYUV[n].R = cr;
-          pByte[n].B = clamp(m_Y[y] + m_CbToB[cb], 0, 0xFF);
-          pByte[n].G = clamp(m_Y[y] + m_CbToG[cb] + m_CrToG[cr], 0, 0xFF);
-          pByte[n].R = clamp(m_Y[y] + m_CrToR[cr], 0, 0xFF);
+          pByte[n].B = rlimit_table[m_Y[y] + m_CbToB[cb]];
+          pByte[n].G = rlimit_table[m_Y[y] + m_CbToG[cb] + m_CrToG[cr]];
+          pByte[n].R = rlimit_table[m_Y[y] + m_CrToR[cr]];
         }
         pos += WIDTH;
       }
@@ -563,9 +583,10 @@
           cb = pcb[m];
           cr = pcr[m];
           n = pos + i;
-          pByte[n].B = clamp(m_Y[y] + m_CbToB[cb], 0, 0xFF);
-          pByte[n].G = clamp(m_Y[y] + m_CbToG[cb] + m_CrToG[cr], 0, 0xFF);
-          pByte[n].R = clamp(m_Y[y] + m_CrToR[cr], 0, 0xFF);
+          pByte[n].B = rlimit_table[m_Y[y] + m_CbToB[cb]];
+          pByte[n].G = rlimit_table[m_Y[y] + m_CbToG[cb] + m_CrToG[cr]];
+          pByte[n].R = rlimit_table[m_Y[y] + m_CrToR[cr]];
+
         }
         pos += WIDTH;
       }
@@ -607,9 +628,10 @@
           pYUV[n].B = cb;
           pYUV[n].G = y;
           pYUV[n].R = cr;
-          pByte[n].B = clamp(m_Y[y] + m_CbToB[cb], 0, 0xFF);
-          pByte[n].G = clamp(m_Y[y] + m_CbToG[cb] + m_CrToG[cr], 0, 0xFF);
-          pByte[n].R = clamp(m_Y[y] + m_CrToR[cr], 0, 0xFF);
+          pByte[n].B = rlimit_table[m_Y[y] + m_CbToB[cb]];
+          pByte[n].G = rlimit_table[m_Y[y] + m_CbToG[cb] + m_CrToG[cr]];
+          pByte[n].R = rlimit_table[m_Y[y] + m_CrToR[cr]];
+
         }
         pos += WIDTH;
       }
@@ -630,9 +652,10 @@
           cb = pcb[m];
           cr = pcr[m];
           n = pos + i;
-          pByte[n].B = clamp(m_Y[y] + m_CbToB[cb], 0, 0xFF);
-          pByte[n].G = clamp(m_Y[y] + m_CbToG[cb] + m_CrToG[cr], 0, 0xFF);
-          pByte[n].R = clamp(m_Y[y] + m_CrToR[cr], 0, 0xFF);
+          pByte[n].B = rlimit_table[m_Y[y] + m_CbToB[cb]];
+          pByte[n].G = rlimit_table[m_Y[y] + m_CbToG[cb] + m_CrToG[cr]];
+          pByte[n].R = rlimit_table[m_Y[y] + m_CrToR[cr]];
+
         }
         pos += WIDTH;
       }
@@ -749,18 +772,6 @@
     }
   }
 
-  void VQ_Initialize(struct COLOR_CACHE *VQ) {
-    int i;
-
-    for (i = 0; i < 4; i++) {
-      VQ->Index[i] = i;
-    }
-    VQ->Color[0] = 0x008080;
-    VQ->Color[1] = 0xFF8080;
-    VQ->Color[2] = 0x808080;
-    VQ->Color[3] = 0xC08080;
-  }
-
   void Init_Color_Table() {
     int i, x;
     int nScale = 1L << 16;  // equal to power(2,16)
@@ -1029,57 +1040,46 @@
   uint32_t decode(std::vector<uint32_t> &buffer, unsigned long width,
                   unsigned long height, YuvMode yuvmode_in, int y_selector,
                   int uv_selector) {
-    uint32_t i;
     COLOR_CACHE Decode_Color;
 
-    if (width != WIDTH || height != HEIGHT || yuvmode_in != yuvmode ||
+    // If any of our parameters have changed, we need to reinit the jpeg
+    // Tables
+    if (width != USER_WIDTH || height != USER_HEIGHT || yuvmode_in != yuvmode ||
         y_selector != Y_selector || uv_selector != UV_selector) {
+      LOG(DEBUG) << "Reinitializing\n";
       init_JPG_decoding();
-    }
+      USER_WIDTH = width;
+      USER_HEIGHT = height;
 
-    // TODO(ed) use the enum everywhere, not just externally
-    yuvmode = yuvmode_in;       // 0 = YUV444, 1 = YUV420
-    Y_selector = y_selector;    // 0-7
-    UV_selector = uv_selector;  // 0-7
+      yuvmode = yuvmode_in;  // 0 = YUV444, 1 = YUV420
 
-    // TODO(ed) Magic number section.  Document appropriately
-    advance_selector = 0;  // 0-7
-    Mapping = 0;           // 0 or 1
+      // TODO(ed) Magic number section.  Document appropriately
+      Y_selector = y_selector;    // 0-7
+      UV_selector = uv_selector;  // 0-7
 
-    WIDTH = width;
-    HEIGHT = height;
+      advance_selector = 0;  // 0-7
+      Mapping = 0;           // 0 or 1
 
-    VQ_Initialize(&Decode_Color);
-    // OutputDebugString  ("In decode\n");
-    //            GetINFData (VideoEngineInfo);
-    //  AST2000 JPEG block is 16x16(pixels) base
+      WIDTH = width;
+      HEIGHT = height;
 
-    if (yuvmode == YuvMode::YUV420) {
-      auto remainder = WIDTH % 16;
-      if (WIDTH % 16) {
-        WIDTH = WIDTH + 16 - remainder;
+      int block_size = 8;  /// YUV444 has a block size of 8
+      if (yuvmode == YuvMode::YUV420) {
+        block_size = 16;
       }
-      remainder = HEIGHT % 16;
+
+      auto remainder = WIDTH % block_size;
+      if (WIDTH % block_size) {
+        WIDTH = WIDTH + block_size - remainder;
+      }
+      remainder = HEIGHT % block_size;
       if (remainder) {
-        HEIGHT = HEIGHT + 16 - remainder;
-      }
-    } else {
-      if (WIDTH % 8) {
-        WIDTH = WIDTH + 8 - (WIDTH % 8);
-      }
-      if (HEIGHT % 8) {
-        HEIGHT = HEIGHT + 8 - (HEIGHT % 8);
+        HEIGHT = HEIGHT + block_size - remainder;
       }
     }
 
-    int qfactor = 16;
-
-    SCALEFACTOR = qfactor;
-    SCALEFACTORUV = qfactor;
-    ADVANCESCALEFACTOR = 16;
-    ADVANCESCALEFACTORUV = 16;
-
-    // TODO(ed) cleanup cruft
+    LOG(DEBUG) << "Height" << HEIGHT << " WIDTH " << WIDTH << "\n";
+    // TODO(ed) cleanup cruft.  THis global buffer pointer is ugly and error prone
     Buffer = buffer.data();
 
     codebuf = buffer[0];
@@ -1126,7 +1126,7 @@
                         buffer);
           Decode_Color.BitMapBits = 0;
 
-          for (i = 0; i < 1; i++) {
+          for (int i = 0; i < 1; i++) {
             Decode_Color.Index[i] = ((codebuf >> 29) & VQ_INDEX_MASK);
             if (((codebuf >> 31) & VQ_HEADER_MASK) == VQ_NO_UPDATE_HEADER) {
               updatereadbuf(&codebuf, &newbuf, VQ_NO_UPDATE_LENGTH, &newbits,
@@ -1148,7 +1148,7 @@
                         buffer);
           Decode_Color.BitMapBits = 0;
 
-          for (i = 0; i < 1; i++) {
+          for (int i = 0; i < 1; i++) {
             Decode_Color.Index[i] = ((codebuf >> 29) & VQ_INDEX_MASK);
             if (((codebuf >> 31) & VQ_HEADER_MASK) == VQ_NO_UPDATE_HEADER) {
               updatereadbuf(&codebuf, &newbuf, VQ_NO_UPDATE_LENGTH, &newbits,
@@ -1168,7 +1168,7 @@
                         buffer);
           Decode_Color.BitMapBits = 1;
 
-          for (i = 0; i < 2; i++) {
+          for (int i = 0; i < 2; i++) {
             Decode_Color.Index[i] = ((codebuf >> 29) & VQ_INDEX_MASK);
             if (((codebuf >> 31) & VQ_HEADER_MASK) == VQ_NO_UPDATE_HEADER) {
               updatereadbuf(&codebuf, &newbuf, VQ_NO_UPDATE_LENGTH, &newbits,
@@ -1190,7 +1190,7 @@
                         buffer);
           Decode_Color.BitMapBits = 1;
 
-          for (i = 0; i < 2; i++) {
+          for (int i = 0; i < 2; i++) {
             Decode_Color.Index[i] = ((codebuf >> 29) & VQ_INDEX_MASK);
             if (((codebuf >> 31) & VQ_HEADER_MASK) == VQ_NO_UPDATE_HEADER) {
               updatereadbuf(&codebuf, &newbuf, VQ_NO_UPDATE_LENGTH, &newbits,
@@ -1210,7 +1210,7 @@
                         buffer);
           Decode_Color.BitMapBits = 2;
 
-          for (i = 0; i < 4; i++) {
+          for (int i = 0; i < 4; i++) {
             Decode_Color.Index[i] = ((codebuf >> 29) & VQ_INDEX_MASK);
             if (((codebuf >> 31) & VQ_HEADER_MASK) == VQ_NO_UPDATE_HEADER) {
               updatereadbuf(&codebuf, &newbuf, VQ_NO_UPDATE_LENGTH, &newbits,
@@ -1234,7 +1234,7 @@
                         buffer);
           Decode_Color.BitMapBits = 2;
 
-          for (i = 0; i < 4; i++) {
+          for (int i = 0; i < 4; i++) {
             Decode_Color.Index[i] = ((codebuf >> 29) & VQ_INDEX_MASK);
             if (((codebuf >> 31) & VQ_HEADER_MASK) == VQ_NO_UPDATE_HEADER) {
               updatereadbuf(&codebuf, &newbuf, VQ_NO_UPDATE_LENGTH, &newbits,
@@ -1290,6 +1290,8 @@
   // WIDTH and HEIGHT are the modes your display used
   unsigned long WIDTH;
   unsigned long HEIGHT;
+  unsigned long USER_WIDTH;
+  unsigned long USER_HEIGHT;
   unsigned char Y_selector;
   int SCALEFACTOR;
   int SCALEFACTORUV;
@@ -1326,11 +1328,12 @@
   uint8_t YDC_nr = 0, CbDC_nr = 1, CrDC_nr = 1;
   // AC Huffman table number for Y,Cb, Cr
   uint8_t YAC_nr = 0, CbAC_nr = 1, CrAC_nr = 1;
-  int txb, tyb;
+  int txb = 0;
+  int tyb = 0;
   int newbits;
   uint8_t *rlimit_table;
   std::vector<RGB> YUVBuffer;
-  // TODO(ed) this shouldn't exist.  It is cruft that needs cleaning up'
+  // TODO(ed) this shouldn't exist.  It is cruft that needs cleaning up
   uint32_t *Buffer;
 
  public:
diff --git a/include/ast_video_puller.hpp b/include/ast_video_puller.hpp
index d1ba3d5..de75fdf 100644
--- a/include/ast_video_puller.hpp
+++ b/include/ast_video_puller.hpp
@@ -1,13 +1,63 @@
 #pragma once
 
 #include <assert.h>
-#include <video.h>
+//#include <video.h>
 #include <ast_video_types.hpp>
 #include <iostream>
 #include <vector>
 
 namespace AstVideo {
 class VideoPuller {
+  //
+  // Cursor struct is used in User Mode
+  //
+  typedef struct _cursor_attribution_tag {
+    unsigned int posX;
+    unsigned int posY;
+    unsigned int cur_width;
+    unsigned int cur_height;
+    unsigned int cur_type;  // 0:mono 1:color 2:disappear cursor
+    unsigned int cur_change_flag;
+  } AST_CUR_ATTRIBUTION_TAG;
+
+  //
+  // For storing Cursor Information
+  //
+  typedef struct _cursor_tag {
+    AST_CUR_ATTRIBUTION_TAG attr;
+    // unsigned char     icon[MAX_CUR_OFFSETX*MAX_CUR_OFFSETY*2];
+    unsigned char *icon;  //[64*64*2];
+  } AST_CURSOR_TAG;
+
+  //
+  // For select image format, i.e. 422 JPG420, 444 JPG444, lumin/chrom table, 0
+  // ~ 11, low to high
+  //
+  typedef struct _video_features {
+    short jpg_fmt;  // 422:JPG420, 444:JPG444
+    short lumin_tbl;
+    short chrom_tbl;
+    short tolerance_noise;
+    int w;
+    int h;
+    unsigned char *buf;
+  } FEATURES_TAG;
+
+  //
+  // For configure video engine control registers
+  //
+  typedef struct _image_info {
+    short do_image_refresh;  // Action 0:motion 1:fullframe 2:quick cursor
+    char qc_valid;           // quick cursor enable/disable
+    unsigned int len;
+    int crypttype;
+    char cryptkey[16];
+    union {
+      FEATURES_TAG features;
+      AST_CURSOR_TAG cursor_info;
+    } parameter;
+  } IMAGE_INFO;
+
  public:
   VideoPuller() : image_info(){};
 
@@ -26,7 +76,6 @@
     assert(video_fd != 0);
     RawVideoBuffer raw;
 
-    IMAGE_INFO image_info{};
     image_info.do_image_refresh = 1;  // full frame refresh
     image_info.qc_valid = 0;          // quick cursor disabled
     image_info.parameter.features.w = 0;
diff --git a/include/video.h b/include/video.h
deleted file mode 100644
index 7662c9c..0000000
--- a/include/video.h
+++ /dev/null
@@ -1,378 +0,0 @@
-/*
-* The definition and structure for AST 2500 Video Capture Driver
-* Portions Copyright (C) 2015 Insyde Software Corp.
-*
-* This program is free software; you can redistribute it and/or modify it
-* under the terms and conditions of the GNU General Public License,
-* version 2, as published by the Free Software Foundation.
-*
-* This program is distributed in the hope it will be useful, but WITHOUT
-* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-* FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-* more details.
-*/
-
-#ifndef _VIDEO_H_
-#define _VIDEO_H_
-
-#define DEF_Y_TBL             4
-#define DEF_UV_TBL            (7 | 0x10)
-
-#define VIDEO_IOC_MAGIC       'i'
-#define VIDIOCMCAPTURE        _IOW(VIDEO_IOC_MAGIC,  1, struct video_mmap*)
-#define VIDIOCGFBUF           _IOR(VIDEO_IOC_MAGIC,  2, struct video_buffer*)
-#define VIDIOCCAPTURE         _IOW(VIDEO_IOC_MAGIC,  3, unsigned long )
-#define VIDIOCGCAPTURE        _IOR(VIDEO_IOC_MAGIC,  4, subcapture_info*)
-#define VIDIOCSCAPTURE        _IOW(VIDEO_IOC_MAGIC,  5, subcapture_info*)
-#define VIDIOCGSEQ            _IOR(VIDEO_IOC_MAGIC,  6, vseq_info*)
-#define VIDIOCSSEQ            _IOW(VIDEO_IOC_MAGIC,  7, vseq_info*)
-#define VIDIOCGVIN            _IOR(VIDEO_IOC_MAGIC,  8, vin_info*)
-#define VIDIOCSVIN            _IOW(VIDEO_IOC_MAGIC,  9, vin_info*)
-#define VIDIOCGPROC           _IOR(VIDEO_IOC_MAGIC, 10, vproc_info*)
-#define VIDIOCSPROC           _IOW(VIDEO_IOC_MAGIC, 11, vproc_info*)
-#define VIDIOCGCOMP           _IOR(VIDEO_IOC_MAGIC, 12, vcomp_info*)
-#define VIDIOCSCOMP           _IOW(VIDEO_IOC_MAGIC, 13, vcomp_info*)
-#define VIDIOCDBG             _IOR(VIDEO_IOC_MAGIC, 14, unsigned int*)
-#define VIDIOCIMGREFRESH      _IOW(VIDEO_IOC_MAGIC, 15, unsigned int*)
-
-#define VIDEO_IOC_MAXNR       15
-
-#define DUAL_COMP_BUFFER
-#define V_MASK
-
-#define AST2500_DEVICEID      0x25032402
-#define AST2400_DEVICEID      0x00002402
-
-// FLAG_FRAME_SIZE = (x/8) * (y/8) * 4
-// 144K:(1920/8)*(1200/8)*4 (current set 1M)
-#define FLAG_FRAME_SIZE       0x100000 // 1*1024*1024
-// PROC_FRAME_SIZE = X * Y * 4
-// 9M:1920*1200*4,  8M:1600*1200*4,  5M:1280*1024*4,  3M:1024*768*4
-#define PROC_FRAME_SIZE       0x900000 // 9*1024*1024
-// According to VREG(VR_STREAM_BUF_SZ) Video Stream Buffer Size Register
-// bit[2:0] = 7 (128KB), bit[4:3] = 3 (32 packets), So max compression data
-// will be 128KB * 32 = 4 MB,
-// 4M: (128*1024)*32
-#define COMP_FRAME_SIZE       0x400000 // 4*1024*1024
-// Total Video Mem Buffer Size
-// 2 PROC + 2 COMP + 1 FLAG for Capture Eng, 1 PROC + 1 COMP + 1 FLAG for Jpeg Capture Eng
-#define VIDEO_MEM_BUF_SIZE    0x2900000
-// Define Video Memory Start Address According to Memory & Kernel Size
-// Total:128M, 80M for Kernel
-#define SDRAM_MEM_OFFSET_ADDR 0x80000000
-
-#define SYS_MEM_SZ_128M       0
-#define SYS_MEM_SZ_256M       1
-#define SYS_MEM_SZ_512M       2
-#define SYS_MEM_SZ_1024M      3
-
-#define V_MEM_SZ_8M           0
-#define V_MEM_SZ_16M          1
-#define V_MEM_SZ_32M          2
-#define V_MEM_SZ_64M          3
-
-#define MODE_DETECT           0
-#define MODE_CHANGE           1
-#define MAX_NO_SYNC_CNT       100
-#define V_BUSY_TIME_OUT       6           //time tick
-
-// Register Offset
-#define SDRAM_PHY_BASE        0x1E6E0000  //1E6E:0000-1E6E:1FFF
-#define SCU_PHY_BASE          0x1E6E2000  //1E6E:2000-1E6E:2FFF
-#define VIDEO_PHY_BASE        0x1E700000  //1E70:0000-1E7F:FFFF
-
-// IRQ NUMBER
-#define VIDEO_IRQ             7           // for video
-#define CURSOR_IRQ            21          // for quick cursor
-
-// Register Definition
-#define VREG(x)               (*(volatile unsigned int *)(IO_ADDRESS(x + VIDEO_PHY_BASE)))
-#define SDRAMREG(x)           (*(volatile unsigned int *)(IO_ADDRESS(x + SDRAM_PHY_BASE)))
-#define SCUREG(x)             (*(volatile unsigned int *)(IO_ADDRESS(x + SCU_PHY_BASE)))
-
-// Register Protection Key
-#define SCU_UNLOCK_KEY        0x1688A8A8
-#define MCR_UNLOCK_KEY        0xFC600309
-#define VR_UNLOCK_KEY         0x1A038AA8
-
-// SDRAM Memory Controller Register Offset
-#define MCR_PROTECTION_KEY    0x000
-#define MCR_CONFIGURATION     0x004
-#define BACKWARD_SCU_MPLL     0x120
-
-// System Control Unit Register Offset
-#define SCU_PROTECTION_KEY    0x00
-#define SCU_SYSTEM_RESET_CTL  0x04
-#define SCU_CLOCK_SELECTION   0x08
-#define SCU_CLK_STOP_CTL      0x0C
-#define SCU_INTERRUPT_CTL     0x18
-#define SCU_MPLL_PARAMETER    0x20
-#define SCU_MISC1_CTL         0x2C
-#define SCU_SOC_SCRATCH1      0x40
-#define SCU_VGA_SCRATCH1      0x50
-#define SCU_VGA_SCRATCH2      0x54
-#define SCU_HW_STRAPPING      0x70
-#define SCU_SILICON_REV_ID    0x7C
-#define SCU_DEVICE_ID         0x1A4
-
-// Video Register Offset
-#define VR_PROTECT_KEY                0x000
-#define VIDEO_SEQ_CTL                 0x004
-#define VIDEO_PASS1_CTL               0x008
-#define TIMING_GEN_SETTING1           0x00C // if VIDEO_CTL1[5] = 0
-#define TIMING_GEN_SETTING2           0x010 // if VIDEO_CTL1[5] = 0
-#define SCALING_FACTOR                0x014
-#define SCALING_FILTER_PARAMETER0     0x018
-#define SCALING_FILTER_PARAMETER1     0x01C
-#define SCALING_FILTER_PARAMETER2     0x020
-#define SCALING_FILTER_PARAMETER3     0x024
-#define BCD_CTL                       0x02C
-#define CAPTURING_WINDOW_SETTING      0x030
-#define COMP_WINDOW_SETTING           0x034
-#define COMP_STREAM_BUF_PROC_OFFSET   0x038
-#define COMP_STREAM_BUF_READ_OFFSET   0x03C
-#define CRC_BUF_BASE_ADDR             0x040
-#define VIDEO_SOURCE_BUF1_BASE_ADDR   0x044
-#define SOURCE_BUF_SCANLINE_OFFSET    0x048
-#define VIDEO_SOURCE_BUF2_BASE_ADDR   0x04C
-#define BCD_FLAG_BUF_BASE_ADDR        0x050
-#define COMP_STREAM_BUF_BASE_ADDR     0x054
-#define VIDEO_STREAM_BUF_SIZE         0x058
-#define COMP_STREAM_BUF_WRITE_OFFSET  0x05C
-#define VIDEO_COMP_CTL                0x060
-#define JPEG_BIT_CTRL                 0x064
-#define QUANTIZATION_VALUE            0x068
-#define COPY_BUF_BASE_ADDR            0x06C
-#define COMP_STREAM_SIZE              0x070
-#define COMP_BLOCK_NUM                0x074
-#define COMP_STREAM_BUF_END_OFFSET    0x078
-#define COMP_FRAME_COUNTER            0x07C
-#define USER_HDR_PARAM                0x080
-#define SOURCE_L_R_EDGE_DETECT        0x090
-#define SOURCE_T_B_EDGE_DETECT        0x094
-#define MODE_DETECT_STATUS            0x098
-
-/* Video Management Engine, i.e. 2nd Set Video Engine */
-#define VM_SEQ_CTRL                   0x204
-#define VM_PASS_CTRL                  0x208
-#define VM_SCALING_FACTOR             0x214
-#define VM_CAP_WINDOW_SETTING         0x230
-#define VM_COMP_WINDOW_SETTING        0x234
-#define VM_COMP_BUF_PROC_OFFSET       0x238
-#define VM_COMP_BUF_READ_OFFSET       0x23C
-#define VM_JPEG_HEADER_BUFF           0x240
-#define VM_SOURCE_BUFF0               0x244
-#define VM_SRC_BUF_SCANLINE_OFFSET    0x248
-#define VM_COMPRESS_BUFF              0x254
-#define VM_STREAM_SIZE                0x258
-#define VM_COMPRESS_CTRL              0x260
-#define VM_JPEG_BIT_CTRL              0x264
-#define VM_QUANTIZATION_VALUE         0x268
-#define VM_COPY_BUF_BASE_ADDR         0x26C
-#define VM_COMP_STREAM_SIZE           0x070
-#define VM_COMP_BLOCK_NUM             0x074
-#define VM_COMP_STREAM_BUF_END_OFFSET 0x278
-#define VM_USER_HDR_PARAM             0x280
-
-#define VIDEO_PASS3_CTRL              0x300
-#define INTERRUPT_CTL                 0x304
-#define INTERRUPT_STATUS              0x308
-#define MODE_DETECT_PARAMETER         0x30C
-#define MEM_RESTRICT_START_ADDR       0x310
-#define MEM_RESTRICT_END_ADDR         0x314
-#define PRI_CRC_PARAMETER             0x320
-#define SEC_CRC_PARAMETER             0x324
-#define DATA_TRUNCATION               0x328
-#define VGA_SCRATCH_REMAP1            0x340
-#define VGA_SCRATCH_REMAP2            0x344
-#define VGA_SCRATCH_REMAP3            0x348
-#define VGA_SCRATCH_REMAP4            0x34C
-#define VGA_SCRATCH_REMAP5            0x350
-#define VGA_SCRATCH_REMAP6            0x354
-#define VGA_SCRATCH_REMAP7            0x358
-#define VGA_SCRATCH_REMAP8            0x35C
-#define RC4KEYS_REGISTER              0x400 //0x400~0x4FC  RC4 Encryption Key Register #0~#63
-
-//
-// Cursor struct is used in User Mode
-//
-typedef struct _cursor_attribution_tag {
-  unsigned int posX;
-  unsigned int posY;
-  unsigned int cur_width;
-  unsigned int cur_height;
-  unsigned int cur_type;      //0:mono 1:color 2:disappear cursor
-  unsigned int cur_change_flag;
-} AST_CUR_ATTRIBUTION_TAG;
-
-//
-// For storing Cursor Information
-//
-typedef struct _cursor_tag {
-  AST_CUR_ATTRIBUTION_TAG attr;
-  //unsigned char     icon[MAX_CUR_OFFSETX*MAX_CUR_OFFSETY*2];
-  unsigned char *icon;       //[64*64*2];
-} AST_CURSOR_TAG;
-
-//
-// For select image format, i.e. 422 JPG420, 444 JPG444, lumin/chrom table, 0 ~ 11, low to high
-//
-typedef struct _video_features {
-  short jpg_fmt;             //422:JPG420, 444:JPG444
-  short lumin_tbl;
-  short chrom_tbl;
-  short tolerance_noise;
-  int w;
-  int h;
-  unsigned char *buf;
-} FEATURES_TAG;
-
-//
-// For configure video engine control registers
-//
-typedef struct _image_info {
-  short do_image_refresh;    // Action 0:motion 1:fullframe 2:quick cursor
-  char qc_valid;             // quick cursor enable/disable
-  unsigned int len;
-  int crypttype;
-  char cryptkey[16];
-  union {
-    FEATURES_TAG features;
-    AST_CURSOR_TAG cursor_info;
-  } parameter;
-} IMAGE_INFO;
-
-typedef struct _video_set_chk {
-  short get_qc_info;         // Quick Cursor Info
-  short do_image_refresh;
-  FEATURES_TAG features;
-} video_set_chk;
-
-struct video_buffer {
-  void *base;
-  int height, width;
-  int depth;
-  int bytesperline;
-};
-
-//
-// Data Structure for Video Buffer Layout
-// kept information about video buffer layout, used in memory initialization.
-//
-typedef struct _buf_layout {
-  int c_proc;
-  int c_comp;
-  unsigned int in;           // video in buffer
-  unsigned int proc [2];     // old and current proc buffer
-  unsigned int comp [2];     // compressed data buffer
-  unsigned int flag;         // flag buffer
-  unsigned int jpgproc;       // old and current proc buffer for jpeg
-  unsigned int jpgcomp;       // compressed data buffer for jpeg
-  unsigned int jpgflag;       // flag buffer for jpeg
-} buf_layout;
-
-//
-// subcapture_info:
-// linestep - byte per line after scaling, but 32 byte align
-// step - scaling step, decrease 8 pixels a step after scaling.
-// scaled_h - height after scaling.
-// scaled_w - width after scaling.
-// hor_factor, ver_factor - horizontal and vertical scaling factor
-// init - initialized = 0, not initialized = 1, set by mode_detect
-//
-typedef struct _subcature_info {
-  int linestep;
-  short x, y, width, height, scaled_h, scaled_w;
-  unsigned short hor_factor, ver_factor;
-  short step, init;
-} subcapture_info;
-
-//
-// video_hw_info:
-// cap_seq - capture orders, CAP_PASSX and CAP_INIT_FRAME
-// cap_int - interrupt to enable
-// cur_idx - current idx of resolution table content.
-//
-// mode_change must be
-// set by interrupt handler, and clear
-// when capture start.
-//
-
-//FK Comment :
-//interrupt handler for mode_chage
-//capture start, mode_chage, clear
-//cur_idx resolution state, Ex: 800x600 80Hz, ...
-//cap_int interrupt enable
-//cap_seq captor orders i.e. CAP_PASS1, CAP_PASS2..., or CAP_INIT_FRAME
-#define MCAP_FRAME  2
-typedef struct _mcap_info {
-  int offset;
-  int size;
-} mcap_info;
-
-typedef struct _video_hw_info {
-  int cap_seq;
-  mcap_info mcap [MCAP_FRAME];       // record each frame size of mcapture
-  //volatile short width, height, fix_x, fix_y, cur_idx;
-  short width, height, fix_x, fix_y, cur_idx;
-  short max_h, max_w, min_h, min_w;
-  short cap_int;
-
-  char mode_changed;                 //1130 modify
-  //volatile char mode_changed;      //1130 modify
-  char cap_done, capturing, disconnect;  //, mode_changed; //, cur_idx;
-  char can_capture;                  // prevent hardware error.
-  subcapture_info subcap;
-//  VIDEO_ENGINE_INFO ve_info;
-} video_hw_info;
-
-struct video_mmap {
-  unsigned int frame; // Frame (0 - n) for double buffer
-  int height, width;
-  unsigned int format; // should be VIDEO_PALETTE_*
-};
-
-// Internal_Mode Table for resolution checking
-typedef struct {
-  unsigned short HorizontalActive;
-  unsigned short VerticalActive;
-  unsigned short RefreshRateIndex;
-  unsigned int PixelClock;
-} INTERNAL_MODE;
-
-INTERNAL_MODE Internal_Mode [] = {
-    // 1024x768
-    { 1024, 768, 0, 65 },
-    { 1024, 768, 1, 65 },
-    { 1024, 768, 2, 75 },
-    { 1024, 768, 3, 79 },
-    { 1024, 768, 4, 95 },
-
-    // 1280x1024
-    { 1280, 1024, 0, 108 },
-    { 1280, 1024, 1, 108 },
-    { 1280, 1024, 2, 135 },
-    { 1280, 1024, 3, 158 },
-
-    // 1600x1200
-    { 1600, 1200, 0, 162 },
-    { 1600, 1200, 1, 162 },
-    { 1600, 1200, 2, 176 },
-    { 1600, 1200, 3, 189 },
-    { 1600, 1200, 4, 203 },
-    { 1600, 1200, 5, 230 },
-
-    // 1920x1200 reduce blank
-    { 1920, 1200, 0, 157 },
-    { 1920, 1200, 1, 157 },
-};
-
-typedef enum vga_color_mode {
-  VGA_NO_SIGNAL = 0,
-  EGA_MODE,
-  VGA_MODE,
-  VGA_15BPP_MODE,
-  VGA_16BPP_MODE,
-  VGA_32BPP_MODE,
-} color_mode;
-#endif //_VIDEO_H_
diff --git a/include/web_kvm.hpp b/include/web_kvm.hpp
index e558623..2512570 100644
--- a/include/web_kvm.hpp
+++ b/include/web_kvm.hpp
@@ -4,7 +4,6 @@
 
 #include <ast_jpeg_decoder.hpp>
 #include <ast_video_puller.hpp>
-#include <video.h>
 
 namespace crow {
 namespace kvm {
diff --git a/src/getvideo_main.cpp b/src/getvideo_main.cpp
index f20c10b..ad002c3 100644
--- a/src/getvideo_main.cpp
+++ b/src/getvideo_main.cpp
@@ -1,4 +1,3 @@
-#include <video.h>
 
 #include <fcntl.h>
 #include <unistd.h>
@@ -11,6 +10,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+
 #define BUILD_CIMG
 #ifdef BUILD_CIMG
 #define cimg_display 0