[prev in list] [next in list] [prev in thread] [next in thread]
List: xine-cvslog
Subject: [xine-cvs] =?utf-8?q?HG=3A_xine-lib-1=2E2=3A_Detach_input=5Fcdda_?= =?utf-8?q?from_libavutil=2E?=
From: Torsten_Jager <t.jager () gmx ! de>
Date: 2016-09-14 17:12:17
Message-ID: dc696477bb6113545542.1473873050 () hg ! debian ! org
[Download RAW message or body]
# HG changeset patch
# User Torsten Jager <t.jager@gmx.de>
# Date 1473873050 -7200
# Node ID dc696477bb6113545542af7e5416eedd3ea9f492
# Branch default
# Parent 3cc03cd7ba1f2a05408fc2e1ddffe6fbd9c5e5ed
Detach input_cdda from libavutil.
diff --git a/src/input/Makefile.am b/src/input/Makefile.am
--- a/src/input/Makefile.am
+++ b/src/input/Makefile.am
@@ -136,8 +136,8 @@
xineplug_inp_cdda_la_SOURCES = input_cdda.c media_helper.c
xineplug_inp_cdda_la_DEPS = $(XDG_BASEDIR_DEPS)
-xineplug_inp_cdda_la_LIBADD = $(XINE_LIB) $(LTLIBINTL) $(XDG_BASEDIR_LIBS) $(AVUTIL_LIBS)
-xineplug_inp_cdda_la_CPPFLAGS = $(AM_CPPFLAGS) $(XDG_BASEDIR_CPPFLAGS) $(AVUTIL_CFLAGS)
+xineplug_inp_cdda_la_LIBADD = $(XINE_LIB) $(LTLIBINTL) $(XDG_BASEDIR_LIBS)
+xineplug_inp_cdda_la_CPPFLAGS = $(AM_CPPFLAGS) $(XDG_BASEDIR_CPPFLAGS)
xineplug_inp_v4l_la_SOURCES = input_v4l.c
xineplug_inp_v4l_la_LIBADD = $(XINE_LIB) $(ALSA_LIBS) $(LTLIBINTL)
--git a/src/input/input_cdda.c b/src/input/input_cdda.c
--- a/src/input/input_cdda.c
+++ b/src/input/input_cdda.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2000-2012 the xine project
+ * Copyright (C) 2000-2016 the xine project
*
* This file is part of xine, a free video player.
*
@@ -59,18 +59,6 @@
#include <basedir.h>
-#ifdef HAVE_FFMPEG_AVUTIL_H
-# include <base64.h>
-# include <sha1.h>
-#else
-# include <libavutil/base64.h>
-# ifdef HAVE_LIBAVUTIL_SHA_H
-# include <libavutil/sha.h>
-# else
-# include <libavutil/sha1.h>
-# endif
-#endif
-
#define LOG_MODULE "input_cdda"
#define LOG_VERBOSE
/*
@@ -80,6 +68,7 @@
#include <xine/xine_internal.h>
#include <xine/xineutils.h>
#include <xine/input_plugin.h>
+#include "../xine-engine/bswap.h"
#include "media_helper.h"
#if defined(__sun)
@@ -104,15 +93,6 @@
#define CD_LEADOUT_TRACK 0xAA
#define CD_BLOCK_OFFSET 150
-#if !defined(HAVE_LIBAVUTIL_SHA_H)
-/* old libavutil/sha1.h was found... */
-#define AVSHA AVSHA1
-# define av_sha_init(c,b) av_sha1_init(c)
-# define av_sha_update av_sha1_update
-# define av_sha_final av_sha1_final
-# define av_sha_size av_sha1_size
-#endif
-
typedef struct _cdrom_toc_entry {
int track_mode;
int first_frame;
@@ -132,6 +112,144 @@
cdrom_toc_entry leadout_track; /* need to know where last track ends */
} cdrom_toc;
+/*
+ * Quick and dirty sha160 implementation.
+ * We only will hash a few bytes per disc, so there is
+ * no need for high end optimization.
+ */
+
+#define sha160_digest_len 20
+
+typedef struct {
+ uint8_t buf[64];
+ uint32_t state[5];
+ uint32_t n;
+} sha160_t;
+
+static void sha160_init (sha160_t *s) {
+ s->state[0] = 0x67452301;
+ s->state[1] = 0xefcdab89;
+ s->state[2] = 0x98badcfe;
+ s->state[3] = 0x10325476;
+ s->state[4] = 0xc3d2e1f0;
+ s->n = 0;
+}
+
+static void sha160_trans (sha160_t *s) {
+ uint32_t l[80], a, b, c, d, e, i;
+ a = s->state[0];
+ b = s->state[1];
+ c = s->state[2];
+ d = s->state[3];
+ e = s->state[4];
+ for (i = 0; i < 16; i++) {
+ uint32_t t;
+ l[i] = t = _X_BE_32 (s->buf + i * 4);
+ t += e + ((a << 5) | (a >> 27));
+ t += ((b & (c ^ d)) ^ d) + 0x5a827999;
+ e = d;
+ d = c;
+ c = (b << 30) | (b >> 2);
+ b = a;
+ a = t;
+ }
+ for (; i < 20; i++) {
+ uint32_t t;
+ t = l[i - 3] ^ l[i - 8] ^ l[i - 14] ^ l[i - 16];
+ l[i] = t = (t << 1) | (t >> 31);
+ t += e + ((a << 5) | (a >> 27));
+ t += ((b & (c ^ d)) ^ d) + 0x5a827999;
+ e = d;
+ d = c;
+ c = (b << 30) | (b >> 2);
+ b = a;
+ a = t;
+ }
+ for (; i < 40; i++) {
+ uint32_t t;
+ t = l[i - 3] ^ l[i - 8] ^ l[i - 14] ^ l[i - 16];
+ l[i] = t = (t << 1) | (t >> 31);
+ t += e + ((a << 5) | (a >> 27));
+ t += (b ^ c ^ d) + 0x6ed9eba1;
+ e = d;
+ d = c;
+ c = (b << 30) | (b >> 2);
+ b = a;
+ a = t;
+ }
+ for (; i < 60; i++) {
+ uint32_t t;
+ t = l[i - 3] ^ l[i - 8] ^ l[i - 14] ^ l[i - 16];
+ l[i] = t = (t << 1) | (t >> 31);
+ t += e + ((a << 5) | (a >> 27));
+ t += (((b | c) & d) | (b & c)) + 0x8f1bbcdc;
[... 3 lines omitted ...]
+ b = a;
+ a = t;
+ }
+ for (; i < 80; i++) {
+ uint32_t t;
+ t = l[i - 3] ^ l[i - 8] ^ l[i - 14] ^ l[i - 16];
+ l[i] = t = (t << 1) | (t >> 31);
+ t += e + ((a << 5) | (a >> 27));
+ t += (b ^ c ^ d) + 0xca62c1d6;
+ e = d;
+ d = c;
+ c = (b << 30) | (b >> 2);
+ b = a;
+ a = t;
+ }
+ s->state[0] += a;
+ s->state[1] += b;
+ s->state[2] += c;
+ s->state[3] += d;
+ s->state[4] += e;
+}
+
+static void sha160_update (sha160_t *s, const uint8_t *data, size_t len) {
+ while (len) {
+ size_t part = 64 - (s->n & 63);
+ if (part > len)
+ part = len;
+ memcpy (s->buf + (s->n & 63), data, part);
+ data += part;
+ s->n += part;
+ if (!(s->n & 63))
+ sha160_trans (s);
+ len -= part;
+ }
+}
+
+static void sha160_final (sha160_t *s, uint8_t *dest) {
+ uint32_t p = s->n & 63;
+ s->buf[p++] = 128;
+ if (p == 64) {
+ sha160_trans (s);
+ p = 0;
+ }
+ memset (s->buf + p, 0, 64 - p);
+ if (p >= 57) {
+ sha160_trans (s);
+ p = 0;
+ memset (s->buf, 0, 64);
+ }
+ p = s->n << 3;
+ s->buf[60] = p >> 24;
+ s->buf[61] = p >> 16;
+ s->buf[62] = p >> 8;
+ s->buf[63] = p;
+ sha160_trans (s);
+ for (p = 0; p < 5; p++) {
+ uint32_t v = s->state[p];
+ dest[4 * p] = v >> 24;
+ dest[4 * p + 1] = v >> 16;
+ dest[4 * p + 2] = v >> 8;
+ dest[4 * p + 3] = v;
+ }
+}
+
/**************************************************************************
* xine interface functions
*************************************************************************/
@@ -1849,43 +1967,32 @@
* Compute Musicbrainz CDIndex ID
*/
static void _cdda_cdindex(cdda_input_plugin_t *this, cdrom_toc *toc) {
- char temp[10];
- struct AVSHA *sha_ctx = malloc(av_sha_size);
- unsigned char digest[20];
- /* We're going to encode 20 bytes in base64, which will become
- * 6 * 32 / 8 = 24 bytes.
- * libavutil's base64 encoding functions, though, wants the size to
- * be at least len * 4 / 3 + 12, so let's use 39.
- */
- char base64[39];
+ sha160_t sha;
+ unsigned char temp[40], digest[24];
int i;
- av_sha_init(sha_ctx, 160);
-
- sprintf(temp, "%02X", toc->first_track);
- av_sha_update(sha_ctx, (unsigned char*) temp, strlen(temp));
-
- sprintf(temp, "%02X", toc->last_track - toc->ignore_last_track);
- av_sha_update(sha_ctx, (unsigned char*) temp, strlen(temp));
-
- sprintf (temp, "%08X", toc->leadout_track.first_frame);// + 150);
- av_sha_update(sha_ctx, (unsigned char*) temp, strlen(temp));
+ sha160_init (&sha);
+
+ sprintf (temp, "%02X%02X%08X",
+ toc->first_track,
+ toc->last_track - toc->ignore_last_track,
+ toc->leadout_track.first_frame); /* + 150 */
+ sha160_update (&sha, temp, 12);
for (i = toc->first_track; i <= toc->last_track - toc->ignore_last_track; i++) {
- sprintf(temp, "%08X", toc->toc_entries[i - 1].first_frame);
- av_sha_update(sha_ctx, (unsigned char*) temp, strlen(temp));
+ sprintf (temp, "%08X", toc->toc_entries[i - 1].first_frame);
+ sha160_update (&sha, temp, 8);
}
for (i = toc->last_track - toc->ignore_last_track + 1; i < 100; i++) {
- av_sha_update(sha_ctx, (unsigned char*) temp, strlen(temp));
+ sha160_update (&sha, temp, 8);
}
- av_sha_final(sha_ctx, digest);
- free(sha_ctx);
-
- av_base64_encode(base64, 39, digest, 20);
-
- _x_meta_info_set_utf8(this->stream, XINE_META_INFO_CDINDEX_DISCID, base64);
+ sha160_final (&sha, digest);
+
+ xine_base64_encode (digest, temp, 20);
+
+ _x_meta_info_set_utf8 (this->stream, XINE_META_INFO_CDINDEX_DISCID, temp);
}
/*
------------------------------------------------------------------------------
_______________________________________________
Xine-cvslog mailing list
Xine-cvslog@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/xine-cvslog
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic