亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? yuvdiff.hs

?? Haskell 代碼。 對于 YUV 420 的圖象
?? HS
字號:
-- YUVDiff

import Char
import qualified Data.ByteString as B
import Data.Word
import Foreign ( unsafePerformIO )
import Text.Regex
import List
import Maybe
import System


showCmdUsage = unlines [ "To locate / show difference pixel between YUV seq files.",
                         "",
                         "Usage:\tYUVDiff.exe -opt rec-yuv dec-yuv [F-MY-MX]",
                         "",
                         "opt:\tspWxH\t\tW*H pixels.",
                         "\tsmWxH\t\tW*H macroblocks.",
                         "\tmM\t\tof M mode, where M may be:",
                         "\t\t\t  QCIF, CIF, D1 (case-insensitive)",
                         "",
                         "The last optional argument is to specify which MB to show.",
                         "If this is not specified, I will show you the first diff-MB.",
                         "Where F, MX and MY are all numbers.",
                         "\tF\t\tframe",
                         "\tMX\t\tX coordinate of MB",
                         "\tMY\t\tY coordinate of MB",
                         "",
                         "Made by Levi.G. 2007-06. All rights reserved.",
                         "Email: leaveye <dot> guo <at> gmail <dot> com" ]

main = do
    args <- getArgs
    if length args < 3
      then giveUsage
      else case readOption (args!!0) of
             Just sz -> if length args > 3
                          then findDiffYUV (YUV420,sz) (readPossition (args!!3)) (args!!1) (args!!2)
                          else findDiffYUV (YUV420,sz) Nothing (args!!1) (args!!2)
             Nothing -> giveUsage
  where
    giveUsage = putStr showCmdUsage
    match = matchRegex . mkRegex
    readOption ('-':'s':'p':sz) = case match "([0-9]+)x([0-9]+)" sz of
            Just [ws,hs] -> let w = read ws
                                h = read hs
                            in  if all ((==0).(`rem` 16)) [w,h]
                                  then Just (read ws `div` 16, read hs `div` 16)
                                  else Nothing
            _            -> Nothing
    readOption ('-':'s':'m':sz) = case match "([0-9]+)x([0-9]+)" sz of
            Just [ws,hs] -> Just (read ws, read hs)
            _            -> Nothing
    readOption ('-':'m':m:_) = case toUpper m of
            'Q' ->  readOption "-sp176x144"
            'C' ->  readOption "-sp352x288"
            'D' ->  readOption "-sp720x576"
            _   ->  Nothing
    readOption _ = Nothing
    readPossition opt = case match "([0-9]+)-([0-9]+)-([0-9]+)" opt of
            Just [f,my,mx] -> Just [read f, read my, read mx]
            _              -> Nothing


type Pixel = (Word8,Word8,Word8)

type BlockData = [Pixel]

type Image = B.ByteString

type Size = (Int,Int)

type Matrix = [[Pixel]]

type Picture = Matrix

type Config = (ImageMode, Size)

data ImageMode = YUV420 | YUV422 | YUV444
  deriving (Enum, Eq, Show, Read)


dup      :: Int -> [a] -> [a]
dup _ [] = []
dup n ls = let (t,xs) = splitAt n ls
           in  t ++ t ++ (dup n xs)
chop      :: Int -> [a] -> [[a]]
chop _ [] = []
chop n ls = take n ls : chop n (drop n ls)

mkMBs :: Picture -> [BlockData]
mkMBs = unpack . transpose . pack
  where pack = chop 16 . map (chop 16)
        unpack = map concat . concat

mkBlocks :: [BlockData] -> [BlockData]
mkBlocks = unpack . transpose . pack
  where pack = chop 4 . map (chop 4)
        unpack = map concat . concat

mkPicture :: Config -> [Word8] -> Picture
mkPicture c@(m,(w,h)) img = pixArr
  where pixArr = chop (w*16) pixels
        pixels = pad $ zip3 ys (uvFix us) (uvFix vs)
        pad = take lumaSz . (++ repeat (0,128,128))
        ys = take lumaSz img
        us = take chromaSz . drop lumaSz $ img
        vs = take chromaSz . drop (lumaSz+chromaSz) $ img
        uvFix = case m of
            YUV420 -> dup (w*16) . dup 1
            YUV422 -> dup 1
            YUV444 -> id
        lumaSz = mb88Sz * 4
        chromaSz = case m of
            YUV420 -> mb88Sz
            YUV422 -> mb88Sz * 2
            YUV444 -> mb88Sz * 4
        mb88Sz = (w*h)*(8*8)

showPix :: Pixel -> String
showPix (y,u,v) = showHex y ++ showHex u ++ showHex v
  where showHex x = [toHex (x `div` 16), toHex (x `rem` 16)]
        toHex = fromJust . flip lookup (zip [0..15] "0123456789ABCDEF")

showBlockPair :: [(Pixel,Pixel)] -> String
showBlockPair = unlines . map unwords . concatMap transpose . chop 4 . map diffPairShow
  where diffPairShow (a,b) = if a /= b
                               then [showPix a, showPix b]
                               else [showPix a, "      "]

readImageFile :: Config -> FilePath -> IO [Picture]
readImageFile c fn = do
    img <- B.readFile fn
    return . map (mkPicture c) . chop oneSize . B.unpack $ img
  where oneSize = (*) mbSize . uncurry (*) . snd $ c
        mbSize = case fst c of
                   YUV420 -> 16*16+8*8*2
                   YUV422 -> 16*16+8*16*2
                   YUV444 -> 16*16*3

readOnePicture :: Config -> FilePath -> IO (Maybe Picture)
readOnePicture c fn = do
    hdl <- openBinaryFile fn ReadMode
    hSetBuffering hdl . BlockBuffering . Just $ oneSize
    lenr <- hGetBuf hdl 
  where oneSize = (*) mbSize . uncurry (*) . snd $ c
        mbSize = case fst c of
                   YUV420 -> 16*16+8*8*2
                   YUV422 -> 16*16+8*16*2
                   YUV444 -> 16*16*3

-- Position : (frame, ((mbY, mbX), (offY, offX), (pixY, pixX)))
type Position = (Int,(Int,Int),(Int,Int),(Int,Int))

mkPos :: Config -> Int -> (Position,Int)
mkPos (_,(w,h)) i = ((frame, (mbY, mbX), (offY, offX), (pixY, pixX)),i)
  where frame   = i `div` (w*h*256)
        offset  = i `rem` (w*h*256)
        pixY    = offset `div` (w*16)
        pixX    = offset `rem` (w*16)
        mbY     = pixY `div` 16
        offY    = pixY `rem` 16
        mbX     = pixX `div` 16
        offX    = pixX `rem` 16

backGround = [ "   C D E F|0_1_2_3_4_5_6_7_8_9_A_B_C_D_E_F|0 1 2 3  ",
               "C         |       |       |       |       |         ",
               "D         |       |       |       |       |         ",
               "E         |       |       |       |       |         ",
               "F_________|_______|_______|_______|_______|_________",
               "0 |       |       |       |       |       |       | ",
               "1 |       |       |       |       |       |       | ",
               "2 |       |       |       |       |       |       | ",
               "3 |_______|_______|_______|_______|_______|_______| ",
               "4 |       |       |       |       |       |       | ",
               "5 |       |       |       |       |       |       | ",
               "6 |       |       |       |       |       |       | ",
               "7 |_______|_______|_______|_______|_______|_______| ",
               "8 |       |       |       |       |       |       | ",
               "9 |       |       |       |       |       |       | ",
               "A |       |       |       |       |       |       | ",
               "B |_______|_______|_______|_______|_______|_______| ",
               "C |       |       |       |       |       |       | ",
               "D |       |       |       |       |       |       | ",
               "E |       |       |       |       |       |       | ",
               "F_|_______|_______|_______|_______|_______|_______|_",
               "0         |       |       |       |       |         ",
               "1         |       |       |       |       |         ",
               "2         |       |       |       |       |         ",
               "3         |_______|_______|_______|_______|         ",
               "          |                               |         " ]

placeMark :: [String] -> (Int,Int) -> ((String,String),Position) -> [String]
placeMark g (by,bx) (p,(_,(my,mx),(oy,ox),_)) = replace g (y+1)
                                              . replace (g!!(y+1)) (x+x+3)
                                              . uncurry getMark $ p
  where getMark p1 p2 = last . show
                      . sum . map (product . flip replicate 2 . (2-))
                      . findIndices (uncurry (/=))
                      $ zip (chop 2 p1) (chop 2 p2)
        x | bx == mx      = ox + 4
          | bx == mx - 1  = ox + 4 + 16
          | bx == mx + 1  = ox - 12
        y | by == my      = oy + 4
          | by == my - 1  = oy + 4 + 16
          | by == my + 1  = oy - 12
        replace [] _ _ = []
        replace (x:xs) 0 y = y : xs
        replace (x:xs) (n+1) y = x : replace xs n y

findDiffYUV :: Config -> Maybe [Int] -> FilePath -> FilePath -> IO ()
findDiffYUV c@(m,(w,h)) focusP fn1 fn2 = do
  let img1 = unsafePerformIO $ readImageFile c fn1
  let img2 = unsafePerformIO $ readImageFile c fn2
  let pixelPairs = zip ((concat . concat) img1) ((concat . concat) img2)
  let diffIdcs = findIndices (uncurry (/=)) pixelPairs
  if isNothing focusP && null diffIdcs
    then putStrLn . concat $ ["No difference between '", fn1, "' and '", fn2, "'."]
    else do
      let sameMB (f1,m1,_,_) (f2,m2,_,_) = f1 == f2 && m1 == m2
      let diffs = sort . map (mkPos c) $ diffIdcs
      let ((focusFrame,focusMB,_,_),_) = if focusP == Nothing
                          then head diffs
                          else let Just [f,my,mx] = focusP
                               in  ((f, (my, mx), (0,0), (0,0)), 0)
      let close (mby,mbx) ((my,mx),(oy,ox))
            | mby == my && mbx == mx                  = True
            | mby == my && mbx == mx - 1 && ox < 4    = True
            | mby == my && mbx == mx + 1 && ox >= 12  = True
            | mbx == mx && mby == my - 1 && oy < 4    = True
            | mbx == mx && mby == my + 1 && oy >= 12  = True
            | otherwise                               = False
      let near (frm,mb) (f,m,o,_) = f == frm && close mb (m,o)
      let (diffPoss, idcs) = unzip . filter (near (focusFrame,focusMB) . fst) $ diffs
      let diffPels = map ((\(a,b) -> (showPix a, showPix b)) . (!!) pixelPairs) idcs
      putStr . unlines $ [ "diffMarkNum = (yuv)b",
                           "center (Frame,(MB_y,MB_x)) = " ++ show ( focusFrame, focusMB ) ]
      putStr . unlines . foldl (flip placeMark focusMB) backGround $ zip diffPels diffPoss
      putStrLn "((Pixel1,Pixel2), (frame, (mbY, mbX), (offY, offX), (pixY, pixX)))"
      mapM_ print $ zip diffPels diffPoss

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一级欧美三级| 欧美日韩视频一区二区| 男女激情视频一区| 午夜视频久久久久久| 亚洲h在线观看| 午夜日韩在线电影| 日产欧产美韩系列久久99| 三级精品在线观看| 久久99国产精品尤物| 国产精品一区二区你懂的| 国产91精品在线观看| 成人午夜视频福利| 色美美综合视频| 精品视频在线免费看| 欧美一区二区三区四区五区 | 亚洲蜜桃精久久久久久久| 中文字幕一区二区三中文字幕| 亚洲欧洲色图综合| 亚洲一区二区三区四区的| 偷窥国产亚洲免费视频| 精品一区二区免费看| 国产91露脸合集magnet| 欧美亚洲国产bt| 精品久久久久av影院| 国产精品美女久久久久久久| 亚洲一区二区三区四区中文字幕| 日本vs亚洲vs韩国一区三区| 老司机精品视频导航| 成人a免费在线看| 欧美午夜宅男影院| 久久理论电影网| 亚洲一区二区三区自拍| 激情深爱一区二区| 91黄色免费版| 国产喷白浆一区二区三区| 亚洲成人免费av| 成人免费视频一区| 日韩欧美国产一区二区三区| 中文字幕电影一区| 免费一级片91| 91最新地址在线播放| 精品福利一区二区三区| 亚洲三级电影网站| 国产精品一二三四区| 欧美图区在线视频| 国产欧美精品一区二区三区四区| 亚洲电影欧美电影有声小说| 东方aⅴ免费观看久久av| 欧美日本高清视频在线观看| 综合久久国产九一剧情麻豆| 国产真实乱偷精品视频免| 欧美日韩精品一区二区三区蜜桃 | 国产一区二区免费在线| 欧美伊人精品成人久久综合97| 国产欧美日韩不卡| 毛片一区二区三区| 欧美日本在线一区| 一区二区三区高清不卡| 成人丝袜高跟foot| 欧美国产97人人爽人人喊| 精品一区二区三区免费| 欧美福利电影网| 亚洲第一成年网| 欧美视频完全免费看| 亚洲激情男女视频| 91国内精品野花午夜精品| 中文字幕一区二区三区精华液| 久久99精品久久只有精品| 91精品国产综合久久国产大片| 亚洲午夜精品网| 欧美午夜理伦三级在线观看| 亚洲一区二区四区蜜桃| 欧美日韩综合色| 调教+趴+乳夹+国产+精品| 欧美日韩视频第一区| 日韩制服丝袜先锋影音| 制服丝袜激情欧洲亚洲| 日韩成人免费电影| 精品国产伦一区二区三区观看方式 | 国产激情一区二区三区四区 | 欧美精品精品一区| 亚洲123区在线观看| 欧美精品v日韩精品v韩国精品v| 亚洲一区二区三区美女| 欧美另类z0zxhd电影| 青青草原综合久久大伊人精品| 日韩欧美在线影院| 国产乱码精品一品二品| 国产精品久久久久久久蜜臀| 不卡一区在线观看| 亚洲一本大道在线| 日韩三级视频中文字幕| 国产成人aaaa| 一区二区成人在线观看| 制服丝袜亚洲播放| 成人网在线免费视频| 亚洲高清视频在线| 久久综合九色综合久久久精品综合| 国产成人综合亚洲网站| 亚洲精品日韩综合观看成人91| 欧美色偷偷大香| 国产一区日韩二区欧美三区| 中文字幕一区二区日韩精品绯色| 欧美视频中文字幕| 国产一区二区三区高清播放| 日韩美女啊v在线免费观看| 欧美久久高跟鞋激| 成人精品鲁一区一区二区| 亚洲最色的网站| 久久久美女毛片| 欧美自拍偷拍一区| 国产91精品露脸国语对白| 亚洲高清视频中文字幕| 亚洲国产成人私人影院tom| 欧美精品黑人性xxxx| 972aa.com艺术欧美| 国产一区二区三区在线观看精品| 亚洲激情欧美激情| 欧美经典三级视频一区二区三区| 欧美日韩在线一区二区| 成人免费观看视频| 国产综合色在线视频区| 亚洲一二三级电影| 亚洲色图制服诱惑| 久久精品一区二区三区不卡 | 国产一二精品视频| www.欧美亚洲| 亚洲国产精品久久久男人的天堂 | www.亚洲人| 久久精品理论片| 亚洲高清免费视频| 中文字幕欧美一| 久久免费精品国产久精品久久久久| 91福利视频久久久久| av不卡在线播放| 国产麻豆精品theporn| 免费看欧美女人艹b| 亚洲午夜av在线| 亚洲男女一区二区三区| 日韩理论片在线| 国产精品天天摸av网| 久久久精品2019中文字幕之3| 午夜不卡在线视频| 亚洲综合色网站| 亚洲欧洲www| 久久精品欧美一区二区三区不卡| 6080yy午夜一二三区久久| 欧美在线影院一区二区| 一本色道久久综合精品竹菊| 91尤物视频在线观看| 成人av网站在线观看免费| 国产69精品久久久久777| 国产一区二区福利| 国内成人精品2018免费看| 久久99九九99精品| 国产精品综合一区二区三区| 国产一区二区网址| 国产成人午夜99999| 国产69精品久久久久毛片| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 亚洲精品videosex极品| 亚洲精品一二三四区| 一级女性全黄久久生活片免费| 亚洲欧美日韩久久| 亚洲一区二区精品久久av| 天堂影院一区二区| 韩国精品一区二区| 成人av网站在线| 欧美日韩极品在线观看一区| 91精品国产麻豆| 国产调教视频一区| 亚洲三级小视频| 免费观看久久久4p| 国产成人综合精品三级| 91一区二区在线| 7777精品伊人久久久大香线蕉经典版下载 | 国产乱码精品一区二区三区忘忧草 | 美女久久久精品| 国产成人在线观看| 一区二区成人在线| 欧美日韩精品欧美日韩精品一| 极品少妇xxxx精品少妇偷拍| 国产91色综合久久免费分享| 色噜噜夜夜夜综合网| 精品国产一区二区三区忘忧草 | 一区二区三区中文在线观看| 天天色天天爱天天射综合| 国产一区二区三区在线观看免费视频 | 91视视频在线观看入口直接观看www | 久久日韩粉嫩一区二区三区| 最新日韩在线视频| 蜜桃一区二区三区在线观看| 99精品黄色片免费大全| 69堂国产成人免费视频| 国产精品美女久久久久av爽李琼 | 久久久噜噜噜久久中文字幕色伊伊| 国产精品女主播av| 久久精品国产成人一区二区三区| 97久久超碰国产精品电影| 2014亚洲片线观看视频免费|