Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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. #include "avformat.h"
  27. #include "internal.h"
  28.  
  29. static int framecrc_write_header(struct AVFormatContext *s)
  30. {
  31.     int i;
  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);
  39.         }
  40.     }
  41.  
  42.     return ff_framehash_write_header(s);
  43. }
  44.  
  45. static int framecrc_write_packet(struct AVFormatContext *s, AVPacket *pkt)
  46. {
  47.     uint32_t crc = av_adler32_update(0, pkt->data, pkt->size);
  48.     char buf[256];
  49.  
  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) {
  55.         int i, j;
  56.         av_strlcatf(buf, sizeof(buf), ", S=%d", pkt->side_data_elems);
  57.  
  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),
  64.                                                       1);
  65.                 }
  66.             } else {
  67.                 side_data_crc = av_adler32_update(0,
  68.                                                   pkt->side_data[i].data,
  69.                                                   pkt->side_data[i].size);
  70.             }
  71.             av_strlcatf(buf, sizeof(buf), ", %8d, 0x%08x", pkt->side_data[i].size, side_data_crc);
  72.         }
  73.     }
  74.     av_strlcatf(buf, sizeof(buf), "\n");
  75.     avio_write(s->pb, buf, strlen(buf));
  76.     return 0;
  77. }
  78.  
  79. AVOutputFormat ff_framecrc_muxer = {
  80.     .name              = "framecrc",
  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 |
  87.                          AVFMT_TS_NEGATIVE,
  88. };
  89.