@ -1,5 +1,5 @@
/*
* MD5 encoder ( for codec / format testing )
* Hash / MD5 encoder ( for codec / format testing )
* Copyright ( c ) 2009 Reimar Döffinger , based on crcenc ( c ) 2002 Fabrice Bellard
*
* This file is part of FFmpeg .
@ -26,23 +26,23 @@
# include "avformat.h"
# include "internal.h"
struct MD5 Context {
struct Hash Context {
const AVClass * avclass ;
struct AVHashContext * hash ;
char * hash_name ;
int format_version ;
} ;
static void md5 _finish( struct AVFormatContext * s , char * buf )
static void hash _finish( struct AVFormatContext * s , char * buf )
{
struct MD5 Context * c = s - > priv_data ;
uint8_t md5 [ AV_HASH_MAX_SIZE ] ;
struct Hash Context * c = s - > priv_data ;
uint8_t hash [ AV_HASH_MAX_SIZE ] ;
int i , offset = strlen ( buf ) ;
int len = av_hash_get_size ( c - > hash ) ;
av_assert0 ( len > 0 & & len < = sizeof ( md5 ) ) ;
av_hash_final ( c - > hash , md5 ) ;
av_assert0 ( len > 0 & & len < = sizeof ( hash ) ) ;
av_hash_final ( c - > hash , hash ) ;
for ( i = 0 ; i < len ; i + + ) {
snprintf ( buf + offset , 3 , " %02 " PRIx8 , md5 [ i ] ) ;
snprintf ( buf + offset , 3 , " %02 " PRIx8 , hash [ i ] ) ;
offset + = 2 ;
}
buf [ offset ] = ' \n ' ;
@ -52,25 +52,28 @@ static void md5_finish(struct AVFormatContext *s, char *buf)
avio_flush ( s - > pb ) ;
}
# define OFFSET(x) offsetof(struct MD5 Context, x)
# define OFFSET(x) offsetof(struct Hash Context, x)
# define ENC AV_OPT_FLAG_ENCODING_PARAM
# if CONFIG_HASH_MUXER || CONFIG_FRAMEHASH_MUXER
static const AVOption hash_options [ ] = {
{ " hash " , " set hash to use " , OFFSET ( hash_name ) , AV_OPT_TYPE_STRING , { . str = " md5 " } , 0 , 0 , ENC } ,
{ " hash " , " set hash to use " , OFFSET ( hash_name ) , AV_OPT_TYPE_STRING , { . str = " sha256 " } , 0 , 0 , ENC } ,
{ " format_version " , " file format version " , OFFSET ( format_version ) , AV_OPT_TYPE_INT , { . i64 = 1 } , 1 , 1 , ENC } ,
{ NULL } ,
} ;
# endif
static const AVClass md5enc_class = {
. class_name = " hash encoder class " ,
. item_name = av_default_item_name ,
. option = hash_options ,
. version = LIBAVUTIL_VERSION_INT ,
# if CONFIG_MD5_MUXER || CONFIG_FRAMEMD5_MUXER
static const AVOption md5_options [ ] = {
{ " hash " , " set hash to use " , OFFSET ( hash_name ) , AV_OPT_TYPE_STRING , { . str = " md5 " } , 0 , 0 , ENC } ,
{ " format_version " , " file format version " , OFFSET ( format_version ) , AV_OPT_TYPE_INT , { . i64 = 1 } , 1 , 1 , ENC } ,
{ NULL } ,
} ;
# endif
# if CONFIG_MD5_MUXER
static int write_header ( struct AVFormatContext * s )
# if CONFIG_HASH_MUXER || CONFIG_ MD5_MUXER
static int hash_ write_header( struct AVFormatContext * s )
{
struct MD5 Context * c = s - > priv_data ;
struct Hash Context * c = s - > priv_data ;
int res = av_hash_alloc ( & c - > hash , c - > hash_name ) ;
if ( res < 0 )
return res ;
@ -78,45 +81,77 @@ static int write_header(struct AVFormatContext *s)
return 0 ;
}
static int write_packet ( struct AVFormatContext * s , AVPacket * pkt )
static int hash_ write_packet( struct AVFormatContext * s , AVPacket * pkt )
{
struct MD5 Context * c = s - > priv_data ;
struct Hash Context * c = s - > priv_data ;
av_hash_update ( c - > hash , pkt - > data , pkt - > size ) ;
return 0 ;
}
static int write_trailer ( struct AVFormatContext * s )
static int hash_ write_trailer( struct AVFormatContext * s )
{
struct MD5 Context * c = s - > priv_data ;
struct Hash Context * c = s - > priv_data ;
char buf [ 256 ] ;
av_strlcpy ( buf , av_hash_get_name ( c - > hash ) , sizeof ( buf ) - 200 ) ;
av_strlcat ( buf , " = " , sizeof ( buf ) - 200 ) ;
md5 _finish( s , buf ) ;
hash _finish( s , buf ) ;
av_hash_freep ( & c - > hash ) ;
return 0 ;
}
# endif
# if CONFIG_HASH_MUXER
static const AVClass hashenc_class = {
. class_name = " hash encoder class " ,
. item_name = av_default_item_name ,
. option = hash_options ,
. version = LIBAVUTIL_VERSION_INT ,
} ;
AVOutputFormat ff_hash_muxer = {
. name = " hash " ,
. long_name = NULL_IF_CONFIG_SMALL ( " Hash testing " ) ,
. priv_data_size = sizeof ( struct HashContext ) ,
. audio_codec = AV_CODEC_ID_PCM_S16LE ,
. video_codec = AV_CODEC_ID_RAWVIDEO ,
. write_header = hash_write_header ,
. write_packet = hash_write_packet ,
. write_trailer = hash_write_trailer ,
. flags = AVFMT_VARIABLE_FPS | AVFMT_TS_NONSTRICT |
AVFMT_TS_NEGATIVE ,
. priv_class = & hashenc_class ,
} ;
# endif
# if CONFIG_MD5_MUXER
static const AVClass md5enc_class = {
. class_name = " MD5 encoder class " ,
. item_name = av_default_item_name ,
. option = md5_options ,
. version = LIBAVUTIL_VERSION_INT ,
} ;
AVOutputFormat ff_md5_muxer = {
. name = " md5 " ,
. long_name = NULL_IF_CONFIG_SMALL ( " MD5 testing " ) ,
. priv_data_size = sizeof ( struct MD5Context ) ,
. priv_data_size = sizeof ( struct Hash Context) ,
. audio_codec = AV_CODEC_ID_PCM_S16LE ,
. video_codec = AV_CODEC_ID_RAWVIDEO ,
. write_header = write_header ,
. write_packet = write_packet ,
. write_trailer = write_trailer ,
. write_header = hash_ write_header,
. write_packet = hash_ write_packet,
. write_trailer = hash_ write_trailer,
. flags = AVFMT_VARIABLE_FPS | AVFMT_TS_NONSTRICT |
AVFMT_TS_NEGATIVE ,
. priv_class = & md5enc_class ,
} ;
# endif
# if CONFIG_FRAMEMD5_MUXER
static int framemd5_write_header ( struct AVFormatContext * s )
# if CONFIG_FRAMEHASH_MUXER || CONFIG_FRAME MD5_MUXER
static int framehash _write_header ( struct AVFormatContext * s )
{
struct MD5Context * c = s - > priv_data ;
struct Hash Context * c = s - > priv_data ;
int res = av_hash_alloc ( & c - > hash , c - > hash_name ) ;
if ( res < 0 )
return res ;
@ -128,42 +163,67 @@ static int framemd5_write_header(struct AVFormatContext *s)
return 0 ;
}
static int framemd5 _write_packet ( struct AVFormatContext * s , AVPacket * pkt )
static int framehash _write_packet ( struct AVFormatContext * s , AVPacket * pkt )
{
struct MD5 Context * c = s - > priv_data ;
struct Hash Context * c = s - > priv_data ;
char buf [ 256 ] ;
av_hash_init ( c - > hash ) ;
av_hash_update ( c - > hash , pkt - > data , pkt - > size ) ;
snprintf ( buf , sizeof ( buf ) - 64 , " %d, %10 " PRId64 " , %10 " PRId64 " , %8 " PRId64 " , %8d, " ,
pkt - > stream_index , pkt - > dts , pkt - > pts , pkt - > duration , pkt - > size ) ;
md5 _finish( s , buf ) ;
hash _finish( s , buf ) ;
return 0 ;
}
static int framemd5 _write_trailer ( struct AVFormatContext * s )
static int framehash _write_trailer ( struct AVFormatContext * s )
{
struct MD5 Context * c = s - > priv_data ;
struct Hash Context * c = s - > priv_data ;
av_hash_freep ( & c - > hash ) ;
return 0 ;
}
# endif
static const AVClass framemd5_class = {
# if CONFIG_FRAMEHASH_MUXER
static const AVClass framehash_class = {
. class_name = " frame hash encoder class " ,
. item_name = av_default_item_name ,
. option = hash_options ,
. version = LIBAVUTIL_VERSION_INT ,
} ;
AVOutputFormat ff_framehash_muxer = {
. name = " framehash " ,
. long_name = NULL_IF_CONFIG_SMALL ( " Per-frame hash testing " ) ,
. priv_data_size = sizeof ( struct HashContext ) ,
. audio_codec = AV_CODEC_ID_PCM_S16LE ,
. video_codec = AV_CODEC_ID_RAWVIDEO ,
. write_header = framehash_write_header ,
. write_packet = framehash_write_packet ,
. write_trailer = framehash_write_trailer ,
. flags = AVFMT_VARIABLE_FPS | AVFMT_TS_NONSTRICT |
AVFMT_TS_NEGATIVE ,
. priv_class = & framehash_class ,
} ;
# endif
# if CONFIG_FRAMEMD5_MUXER
static const AVClass framemd5_class = {
. class_name = " frame hash encoder class " ,
. item_name = av_default_item_name ,
. option = md5_options ,
. version = LIBAVUTIL_VERSION_INT ,
} ;
AVOutputFormat ff_framemd5_muxer = {
. name = " framemd5 " ,
. long_name = NULL_IF_CONFIG_SMALL ( " Per-frame MD5 testing " ) ,
. priv_data_size = sizeof ( struct MD5Context ) ,
. priv_data_size = sizeof ( struct Hash Context) ,
. audio_codec = AV_CODEC_ID_PCM_S16LE ,
. video_codec = AV_CODEC_ID_RAWVIDEO ,
. write_header = framemd5_write_header ,
. write_packet = framemd5_write_packet ,
. write_trailer = framemd5_write_trailer ,
. write_header = framehash _write_header ,
. write_packet = framehash _write_packet ,
. write_trailer = framehash _write_trailer ,
. flags = AVFMT_VARIABLE_FPS | AVFMT_TS_NONSTRICT |
AVFMT_TS_NEGATIVE ,
. priv_class = & framemd5_class ,