Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright (c) 2010 Mans Rullgard
  3.  *
  4.  * This file is part of FFmpeg.
  5.  *
  6.  * FFmpeg is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU Lesser General Public
  8.  * License as published by the Free Software Foundation; either
  9.  * version 2.1 of the License, or (at your option) any later version.
  10.  *
  11.  * FFmpeg is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  * Lesser General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU Lesser General Public
  17.  * License along with FFmpeg; if not, write to the Free Software
  18.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19.  */
  20.  
  21. #include <stdio.h>
  22. #include "libavutil/avstring.h"
  23. #include "libavutil/md5.h"
  24. #include "libavutil/mem.h"
  25. #include "libavutil/error.h"
  26. #include "avformat.h"
  27. #include "avio.h"
  28. #include "url.h"
  29.  
  30. struct MD5Context {
  31.     struct AVMD5 *md5;
  32. };
  33.  
  34. static int md5_open(URLContext *h, const char *filename, int flags)
  35. {
  36.     struct MD5Context *c = h->priv_data;
  37.  
  38.     if (!(flags & AVIO_FLAG_WRITE))
  39.         return AVERROR(EINVAL);
  40.  
  41.     c->md5 = av_md5_alloc();
  42.     if (!c->md5)
  43.         return AVERROR(ENOMEM);
  44.     av_md5_init(c->md5);
  45.  
  46.     return 0;
  47. }
  48.  
  49. static int md5_write(URLContext *h, const unsigned char *buf, int size)
  50. {
  51.     struct MD5Context *c = h->priv_data;
  52.     av_md5_update(c->md5, buf, size);
  53.     return size;
  54. }
  55.  
  56. static int md5_close(URLContext *h)
  57. {
  58.     struct MD5Context *c = h->priv_data;
  59.     const char *filename = h->filename;
  60.     uint8_t md5[16], buf[64];
  61.     URLContext *out;
  62.     int i, err = 0;
  63.  
  64.     av_md5_final(c->md5, md5);
  65.     for (i = 0; i < sizeof(md5); i++)
  66.         snprintf(buf + i*2, 3, "%02x", md5[i]);
  67.     buf[i*2] = '\n';
  68.  
  69.     av_strstart(filename, "md5:", &filename);
  70.  
  71.     if (*filename) {
  72.         err = ffurl_open(&out, filename, AVIO_FLAG_WRITE,
  73.                          &h->interrupt_callback, NULL);
  74.         if (err)
  75.             return err;
  76.         err = ffurl_write(out, buf, i*2+1);
  77.         ffurl_close(out);
  78.     } else {
  79.         if (fwrite(buf, 1, i*2+1, stdout) < i*2+1)
  80.             err = AVERROR(errno);
  81.     }
  82.  
  83.     av_freep(&c->md5);
  84.  
  85.     return err;
  86. }
  87.  
  88.  
  89. URLProtocol ff_md5_protocol = {
  90.     .name                = "md5",
  91.     .url_open            = md5_open,
  92.     .url_write           = md5_write,
  93.     .url_close           = md5_close,
  94.     .priv_data_size      = sizeof(struct MD5Context),
  95. };
  96.