
    fi|                        d dl Z d dlZd dlZd dlZd dlZdZej                  ZdZdZ	dZ
dZd Zd Zd	 Zd
 Zd Zedk(  rd dlZ eej(                        dk  r* ed        ed        ed        ej,                  d       ej(                  d   Zedk(  r$ eej(                  d   ej(                  d          yedk(  r eej(                  d          y ed       yy)    N)2   r   g333333?)r   r            c                 "    | j                         S )z%Convert frame (numpy array) to bytes.)tobytesframes    tiger_video2.pyframe_to_bytesr      s    ==?    c                 Z    t        j                  t        |             j                         S )z&Return SHA256 hex digest of the frame.)hashlibsha256r   	hexdigestr	   s    r   compute_hashr      s    >>./0::<<r   c           	      H   t         \  }}t        j                  |t        t        t
              \  \  }}}t        j                  | |t        z
  ||z
  t        z
  f||z   t        z   ||z   t        z   fdd       t        j                  | |||ft        t        t        t
               y)z;Draw text with a solid white rectangle for OCR readability.)r   r   r   N)
HASH_POScv2getTextSize	HASH_FONT
HASH_SCALEHASH_THICKNESS	rectangleRECT_PADDINGputText
HASH_COLOR)imgtextxytwthbaselines          r   draw_text_with_backgroundr&      s    DAqy*nUHRhMM#|#QVl%:;r6L(!h,*EF!2' KKTAq69j*nUr   c                    t        j                  dd      5 }|j                  }ddd       t        j                  |       }|j                         st        d|        |j                  t        j                        }|r|dk  rd}t        |j                  t        j                              }t        |j                  t        j                              }t        j                  d }t        j                  ||||f      }	|	j                         s|j                          t        d	|       d}
d}t        d
       	 |j!                         \  }}|sn|j#                         }|
t%        |
      }t'        ||       n/t)        j*                  d      j-                         }t'        ||       |	j/                  |       |}
|dz  }|dz  dk(  rt        d| d       |j                          |	j                          t        d|        t        d       t1        j2                  dd|d| dddddddddd|gd       t5        j6                  |       t        d|        y# 1 sw Y   BxY w) z9Streaming encode: visible hash chain, audio copied later.z.mp4F)suffixdeleteNCannot open input video: r   g      >@mp4vz!Cannot open output video writer: z Processing frames (streaming)...Ts   FIRST_FRAME_ANCHOR   d   z  Processed 
 frames...z)Video processing complete. Total frames: zCopying audio stream...ffmpegz-iz-c:vcopyz-c:aaacz-mapz0:v:0z1:a:0z	-shortestz-y)checkz Final video with audio saved to )tempfileNamedTemporaryFilenamer   VideoCaptureisOpenedRuntimeErrorgetCAP_PROP_FPSintCAP_PROP_FRAME_WIDTHCAP_PROP_FRAME_HEIGHTVideoWriter_fourccVideoWriterreleaseprintreadr0   r   r&   r   r   r   write
subprocessrunosunlink)
input_pathoutput_pathtmp
temp_videocap
frame_ratewidthheightfourccwriter
prev_frameframe_indexretr
   	out_framehanchors                    r   encode_videorX   #   sO    
	$	$F5	A SXX
 

:
&C<<>6zlCDD))*Jq
0012E2234F ##V,F__ZeV_MF??>zlKLL JK	
,-
XXZ
U JJL	!Z(A%i3 ^^$9:DDFF%i8 	Y 
q!LZ893 6 KKM
NN	5k]
CD 

#$NNjj  IIj	,[M
:;W s   I%%I/c                    ddl }ddlm} t        j                  |       }|j                         st        d|        d}d}d}t        d       	 |j                         \  }}|snh|Et        \  }	}
|t        d|
dz
        |
dz   t        d|	dz
        |	d	z   f   }|j                  dk(  rt        d
| d       d}pt        j                  |t        j                        }t        j                  |ddt        j                        \  }}|j!                  |      }|j#                  |d      }dj%                  d |D              }t'        |      dk\  r|dd }nt        d
| d| d       d}#t)        |      }||k7  r-t        d
| d       t        d|        t        d|        d}|}|dz  }|dz  dk(  rt        d| d       |j+                          t        d|rdnd d | d!       |S )"u9   Verify the visible hash chain (streaming, chunk‑based).r   N)Imager*   TzVerifying frames (streaming)...r   
   i  zFrame z: cannot read hash regionF   r   z3--psm 7 -c tessedit_char_whitelist=0123456789abcdef)config c              3   *   K   | ]  }|d v s|  yw)0123456789abcdefN ).0cs     r   	<genexpr>zverify_video.<locals>.<genexpr>   s     Ka18J3JKs   	@   z: extracted short hash: ''z: MISMATCH!z  Displayed: z  Actual:    r,   r-   z  Verified r.   z
Verification PASSEDFAILEDz after z frames)pytesseractPILrZ   r   r6   r7   r8   rA   rB   r   maxsizecvtColorCOLOR_BGR2GRAY	thresholdTHRESH_BINARY_INV	fromarrayimage_to_stringjoinlenr   r@   )rH   ri   rZ   readerrR   rS   verifiedrT   current_framer!   r"   roigray_threshpil_imgr    	displayedactuals                      r   verify_videor   t   s#    j)F??6zlCDDJKH	
+,
#[[]]!DAqAqtQrT 13q!B$<#3E EFCxx1}{m+DEF <<S%7%78DdCc6K6KLIAvoof-G..L / D K4KKI9~#%crN	{m+DYKqQR !*-FF"{m;78i[12fX./ "
q!K}J78O R NN	OHh?w{mSZ
[\Or   __main__   zUsage:z<  Encode: python tiger_video2.py encode input.mp4 output.mp4z3  Verify: python tiger_video2.py verify encoded.mp4r,   encodeverifyzUnknown mode.)r   r   r3   rF   rD   r   FONT_HERSHEY_SIMPLEXr   r   r   r   r   r   r   r&   rX   r   __name__sysrt   argvrA   exitmodera   r   r   <module>r      s     
  	  $$	

=VN<b;| z
388}qhLMCD88A;DxSXXa[#((1+.		SXXa[!o r   