1/* 2 * frame CRC encoder (for codec/format testing) 3 * Copyright (c) 2002 Fabrice Bellard 4 * 5 * This file is part of FFmpeg. 6 * 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. 11 * 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. 16 * 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 20 */ 21 22#include <inttypes.h> 23 24#include "libavutil/adler32.h" 25#include "libavutil/avstring.h" 26 27#include "libavcodec/codec_id.h" 28#include "libavcodec/codec_par.h" 29#include "libavcodec/packet.h" 30 31#include "avformat.h" 32#include "internal.h" 33 34static int framecrc_write_header(struct AVFormatContext *s) 35{ 36 int i; 37 for (i = 0; i < s->nb_streams; i++) { 38 AVStream *st = s->streams[i]; 39 AVCodecParameters *par = st->codecpar; 40 if (par->extradata) { 41 uint32_t crc = av_adler32_update(0, par->extradata, par->extradata_size); 42 avio_printf(s->pb, "#extradata %d: %8d, 0x%08"PRIx32"\n", 43 i, par->extradata_size, crc); 44 } 45 } 46 47 return ff_framehash_write_header(s); 48} 49 50static int framecrc_write_packet(struct AVFormatContext *s, AVPacket *pkt) 51{ 52 uint32_t crc = av_adler32_update(0, pkt->data, pkt->size); 53 char buf[256]; 54 55 snprintf(buf, sizeof(buf), "%d, %10"PRId64", %10"PRId64", %8"PRId64", %8d, 0x%08"PRIx32, 56 pkt->stream_index, pkt->dts, pkt->pts, pkt->duration, pkt->size, crc); 57 if (pkt->flags != AV_PKT_FLAG_KEY) 58 av_strlcatf(buf, sizeof(buf), ", F=0x%0X", pkt->flags); 59 if (pkt->side_data_elems) { 60 av_strlcatf(buf, sizeof(buf), ", S=%d", pkt->side_data_elems); 61 62 for (int i = 0; i < pkt->side_data_elems; i++) { 63 av_strlcatf(buf, sizeof(buf), ", %8"SIZE_SPECIFIER, 64 pkt->side_data[i].size); 65 } 66 } 67 av_strlcatf(buf, sizeof(buf), "\n"); 68 avio_write(s->pb, buf, strlen(buf)); 69 return 0; 70} 71 72const AVOutputFormat ff_framecrc_muxer = { 73 .name = "framecrc", 74 .long_name = NULL_IF_CONFIG_SMALL("framecrc testing"), 75 .audio_codec = AV_CODEC_ID_PCM_S16LE, 76 .video_codec = AV_CODEC_ID_RAWVIDEO, 77 .write_header = framecrc_write_header, 78 .write_packet = framecrc_write_packet, 79 .flags = AVFMT_VARIABLE_FPS | AVFMT_TS_NONSTRICT | 80 AVFMT_TS_NEGATIVE, 81}; 82