From 7713841e4d9b2c06ee9af45ffa18e1b395da75a3 Mon Sep 17 00:00:00 2001 From: reimar Date: Sun, 14 Oct 2007 12:11:28 +0000 Subject: Add -lavfdopts cryptokey git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@24785 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libmpdemux/demux_lavf.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'libmpdemux/demux_lavf.c') diff --git a/libmpdemux/demux_lavf.c b/libmpdemux/demux_lavf.c index 07c2301705..6ec11af57b 100644 --- a/libmpdemux/demux_lavf.c +++ b/libmpdemux/demux_lavf.c @@ -49,11 +49,13 @@ extern char *audio_lang; static unsigned int opt_probesize = 0; static unsigned int opt_analyzeduration = 0; static char *opt_format; +static char *opt_cryptokey; m_option_t lavfdopts_conf[] = { {"probesize", &(opt_probesize), CONF_TYPE_INT, CONF_RANGE, 32, INT_MAX, NULL}, {"format", &(opt_format), CONF_TYPE_STRING, 0, 0, 0, NULL}, {"analyzeduration", &(opt_analyzeduration), CONF_TYPE_INT, CONF_RANGE, 0, INT_MAX, NULL}, + {"cryptokey", &(opt_cryptokey), CONF_TYPE_STRING, 0, 0, 0, NULL}, {NULL, NULL, 0, 0, 0, 0, NULL} }; @@ -250,6 +252,23 @@ static int lavf_check_preferred_file(demuxer_t *demuxer){ return 0; } +static uint8_t char2int(char c) { + if (c >= '0' && c <= '9') return c - '0'; + if (c >= 'a' && c <= 'f') return c - 'a' + 10; + if (c >= 'A' && c <= 'F') return c - 'A' + 10; + return 0; +} + +static void parse_cryptokey(AVFormatContext *avfc, const char *str) { + int len = strlen(str) / 2; + uint8_t *key = av_mallocz(len); + int i; + avfc->keylen = len; + avfc->key = key; + for (i = 0; i < len; i++, str += 2) + *key++ = (char2int(str[0]) << 4) | char2int(str[1]); +} + static demuxer_t* demux_open_lavf(demuxer_t *demuxer){ AVFormatContext *avfc; AVFormatParameters ap; @@ -266,6 +285,8 @@ static demuxer_t* demux_open_lavf(demuxer_t *demuxer){ avfc = av_alloc_format_context(); + if (opt_cryptokey) + parse_cryptokey(avfc, opt_cryptokey); if (correct_pts) avfc->flags |= AVFMT_FLAG_GENPTS; if (index_mode == 0) @@ -668,6 +689,7 @@ static void demux_close_lavf(demuxer_t *demuxer) if (priv){ if(priv->avfc) { + av_freep(&priv->avfc->key); av_close_input_file(priv->avfc); priv->avfc= NULL; } free(priv); demuxer->priv= NULL; -- cgit v1.2.3