2 * frame CRC encoder (for codec/format testing)
3 * Copyright (c) 2002 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 #include "libavutil/adler32.h"
25 #include "libavutil/avstring.h"
29 static int framecrc_write_header(struct AVFormatContext
*s
)
32 for (i
= 0; i
< s
->nb_streams
; i
++) {
33 AVStream
*st
= s
->streams
[i
];
34 AVCodecContext
*avctx
= st
->codec
;
35 if (avctx
->extradata
) {
36 uint32_t crc
= av_adler32_update(0, avctx
->extradata
, avctx
->extradata_size
);
37 avio_printf(s
->pb
, "#extradata %d: %8d, 0x%08"PRIx32
"\n",
38 i
, avctx
->extradata_size
, crc
);
42 return ff_framehash_write_header(s
);
45 static int framecrc_write_packet(struct AVFormatContext
*s
, AVPacket
*pkt
)
47 uint32_t crc
= av_adler32_update(0, pkt
->data
, pkt
->size
);
50 snprintf(buf
, sizeof(buf
), "%d, %10"PRId64
", %10"PRId64
", %8d, %8d, 0x%08"PRIx32
,
51 pkt
->stream_index
, pkt
->dts
, pkt
->pts
, pkt
->duration
, pkt
->size
, crc
);
52 if (pkt
->flags
!= AV_PKT_FLAG_KEY
)
53 av_strlcatf(buf
, sizeof(buf
), ", F=0x%0X", pkt
->flags
);
54 if (pkt
->side_data_elems
) {
56 av_strlcatf(buf
, sizeof(buf
), ", S=%d", pkt
->side_data_elems
);
58 for (i
=0; i
<pkt
->side_data_elems
; i
++) {
59 uint32_t side_data_crc
= 0;
60 if (HAVE_BIGENDIAN
&& AV_PKT_DATA_PALETTE
== pkt
->side_data
[i
].type
) {
61 for (j
=0; j
<pkt
->side_data
[i
].size
; j
++) {
62 side_data_crc
= av_adler32_update(side_data_crc
,
63 pkt
->side_data
[i
].data
+ (j
^3),
67 side_data_crc
= av_adler32_update(0,
68 pkt
->side_data
[i
].data
,
69 pkt
->side_data
[i
].size
);
71 av_strlcatf(buf
, sizeof(buf
), ", %8d, 0x%08x", pkt
->side_data
[i
].size
, side_data_crc
);
74 av_strlcatf(buf
, sizeof(buf
), "\n");
75 avio_write(s
->pb
, buf
, strlen(buf
));
79 AVOutputFormat ff_framecrc_muxer
= {
81 .long_name
= NULL_IF_CONFIG_SMALL("framecrc testing"),
82 .audio_codec
= AV_CODEC_ID_PCM_S16LE
,
83 .video_codec
= AV_CODEC_ID_RAWVIDEO
,
84 .write_header
= framecrc_write_header
,
85 .write_packet
= framecrc_write_packet
,
86 .flags
= AVFMT_VARIABLE_FPS
| AVFMT_TS_NONSTRICT
|