Subversion Repositories Kolibri OS

Rev

Go to most recent revision | 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 "libavutil/adler32.h"
  23. #include "libavutil/avstring.h"
  24. #include "avformat.h"
  25. #include "internal.h"
  26.  
  27. static int framecrc_write_packet(struct AVFormatContext *s, AVPacket *pkt)
  28. {
  29.     uint32_t crc = av_adler32_update(0, pkt->data, pkt->size);
  30.     char buf[256];
  31.  
  32.     snprintf(buf, sizeof(buf), "%d, %10"PRId64", %10"PRId64", %8d, %8d, 0x%08x",
  33.              pkt->stream_index, pkt->dts, pkt->pts, pkt->duration, pkt->size, crc);
  34.     if (pkt->flags != AV_PKT_FLAG_KEY)
  35.         av_strlcatf(buf, sizeof(buf), ", F=0x%0X", pkt->flags);
  36.     if (pkt->side_data_elems) {
  37.         int i, j;
  38.         av_strlcatf(buf, sizeof(buf), ", S=%d", pkt->side_data_elems);
  39.  
  40.         for (i=0; i<pkt->side_data_elems; i++) {
  41.             uint32_t side_data_crc = 0;
  42.             if (HAVE_BIGENDIAN && AV_PKT_DATA_PALETTE == pkt->side_data[i].type) {
  43.                 for (j=0; j<pkt->side_data[i].size; j++) {
  44.                     side_data_crc = av_adler32_update(side_data_crc,
  45.                                                       pkt->side_data[i].data + (j^3),
  46.                                                       1);
  47.                 }
  48.             } else {
  49.                 side_data_crc = av_adler32_update(0,
  50.                                                   pkt->side_data[i].data,
  51.                                                   pkt->side_data[i].size);
  52.             }
  53.             av_strlcatf(buf, sizeof(buf), ", %8d, 0x%08x", pkt->side_data[i].size, side_data_crc);
  54.         }
  55.     }
  56.     av_strlcatf(buf, sizeof(buf), "\n");
  57.     avio_write(s->pb, buf, strlen(buf));
  58.     return 0;
  59. }
  60.  
  61. AVOutputFormat ff_framecrc_muxer = {
  62.     .name              = "framecrc",
  63.     .long_name         = NULL_IF_CONFIG_SMALL("framecrc testing"),
  64.     .audio_codec       = AV_CODEC_ID_PCM_S16LE,
  65.     .video_codec       = AV_CODEC_ID_RAWVIDEO,
  66.     .write_header      = ff_framehash_write_header,
  67.     .write_packet      = framecrc_write_packet,
  68.     .flags             = AVFMT_VARIABLE_FPS | AVFMT_TS_NONSTRICT |
  69.                          AVFMT_TS_NEGATIVE,
  70. };
  71.