[vlc-commits] modules/access: remove legacy rar access
Filip Roséen
git at videolan.org
Tue Feb 21 15:55:40 CET 2017
vlc | branch: master | Filip Roséen <filip at atch.se> | Wed Oct 19 09:28:04 2016 +0200| [bd06876331f7eb8045e03078062877f34bd342c0] | committer: Jean-Baptiste Kempf
modules/access: remove legacy rar access
rar extraction is now handled by the libarchive based
modules/stream_extractor/archive.c, as such these files/modules are no
longer needed.
Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=bd06876331f7eb8045e03078062877f34bd342c0
---
NEWS | 1 +
modules/MODULES_LIST | 1 -
modules/access/Makefile.am | 5 -
modules/access/rar/access.c | 247 --------------------------
modules/access/rar/module.c | 39 -----
modules/access/rar/rar.c | 409 --------------------------------------------
modules/access/rar/rar.h | 48 ------
modules/access/rar/stream.c | 162 ------------------
po/POTFILES.in | 4 -
9 files changed, 1 insertion(+), 915 deletions(-)
diff --git a/NEWS b/NEWS
index 6f423ae..f4bd065 100644
--- a/NEWS
+++ b/NEWS
@@ -280,6 +280,7 @@ Removed modules
* BD access module (use libbluray)
* Direct2D module (use Direct3D11)
* EyeTV access module
+ * Rar access and stream filter: use libarchive
Changes between 2.2.0 and 2.2.1:
diff --git a/modules/MODULES_LIST b/modules/MODULES_LIST
index b858438..9e712c6 100644
--- a/modules/MODULES_LIST
+++ b/modules/MODULES_LIST
@@ -310,7 +310,6 @@ $Id$
* pva: PVA demuxer
* qsv: QuickSyncVideo Encoder for Intel hardware
* qt: interface module using the cross-platform Qt widget library
- * rar: RAR access and stream filter
* rawaud: raw audio input module for vlc
* rawdv: Raw DV demuxer
* rawvid: raw video input module for vlc
diff --git a/modules/access/Makefile.am b/modules/access/Makefile.am
index e3ceddf..5dfa536 100644
--- a/modules/access/Makefile.am
+++ b/modules/access/Makefile.am
@@ -36,11 +36,6 @@ access_LTLIBRARIES += libimem_plugin.la
libaccess_imem_plugin_la_SOURCES = access/imem.c
access_LTLIBRARIES += libaccess_imem_plugin.la
-librar_plugin_la_SOURCES = access/rar/rar.c access/rar/rar.h \
- access/rar/access.c access/rar/stream.c access/rar/module.c
-librar_plugin_la_CPPFLAGS = $(AM_CPPFLAGS)
-access_LTLIBRARIES += librar_plugin.la
-
libsdp_plugin_la_SOURCES = access/sdp.c
access_LTLIBRARIES += libsdp_plugin.la
diff --git a/modules/access/rar/access.c b/modules/access/rar/access.c
deleted file mode 100644
index 531aa8e..0000000
--- a/modules/access/rar/access.c
+++ /dev/null
@@ -1,247 +0,0 @@
-/*****************************************************************************
- * access.c: uncompressed RAR access
- *****************************************************************************
- * Copyright (C) 2008-2010 Laurent Aimar
- * $Id$
- *
- * Author: Laurent Aimar <fenrir _AT_ videolan _DOT_ org>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
- *****************************************************************************/
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <vlc_common.h>
-#include <vlc_plugin.h>
-#include <vlc_access.h>
-#include <vlc_stream.h>
-#include <vlc_url.h>
-
-#include <assert.h>
-#include <limits.h>
-
-#include "rar.h"
-
-struct access_sys_t {
- stream_t *s;
- rar_file_t *file;
- const rar_file_chunk_t *chunk;
- uint64_t position;
-};
-
-static int Seek(access_t *access, uint64_t position)
-{
- access_sys_t *sys = access->p_sys;
- const rar_file_t *file = sys->file;
-
- if (position > file->real_size)
- position = file->real_size;
- sys->position = position;
-
- /* Search the chunk */
- const rar_file_chunk_t *old_chunk = sys->chunk;
- for (int i = 0; i < file->chunk_count; i++) {
- sys->chunk = file->chunk[i];
- if (position < sys->chunk->cummulated_size + sys->chunk->size)
- break;
- }
-
- const uint64_t offset = sys->chunk->offset +
- (position - sys->chunk->cummulated_size);
-
- if (strcmp(old_chunk->mrl, sys->chunk->mrl)) {
- if (sys->s)
- vlc_stream_Delete(sys->s);
- sys->s = vlc_stream_NewURL(access, sys->chunk->mrl);
- }
- return sys->s ? vlc_stream_Seek(sys->s, offset) : VLC_EGENERIC;
-}
-
-static ssize_t Read(access_t *access, void *data, size_t size)
-{
- access_sys_t *sys = access->p_sys;
-
- size_t total = 0;
- while (total < size) {
- const uint64_t chunk_end = sys->chunk->cummulated_size + sys->chunk->size;
- int max = __MIN(__MIN((int64_t)(size - total), (int64_t)(chunk_end - sys->position)), INT_MAX);
- if (max <= 0)
- break;
-
- int r = sys->s ? vlc_stream_Read(sys->s, data, max) : -1;
- if (r <= 0)
- break;
-
- total += r;
- if( data )
- data = ((char *)data) + r;
- sys->position += r;
- if (sys->position >= chunk_end &&
- Seek(access, sys->position))
- break;
- }
- return total;
-
-}
-
-static int Control(access_t *access, int query, va_list args)
-{
- access_sys_t *sys = access->p_sys;
- stream_t *s = sys->s;
- if (!s)
- return VLC_EGENERIC;
-
- switch (query) {
- case STREAM_CAN_SEEK: {
- bool *b = va_arg(args, bool *);
- return vlc_stream_Control(s, STREAM_CAN_SEEK, b);
- }
- case STREAM_CAN_FASTSEEK: {
- bool *b = va_arg(args, bool *);
- return vlc_stream_Control(s, STREAM_CAN_FASTSEEK, b);
- }
- /* FIXME the following request should ask the underlying access object */
- case STREAM_CAN_PAUSE:
- case STREAM_CAN_CONTROL_PACE: {
- bool *b = va_arg(args, bool *);
- *b = true;
- return VLC_SUCCESS;
- }
- case STREAM_GET_SIZE:
- *va_arg(args, uint64_t *) = sys->file->size;
- return VLC_SUCCESS;
- case STREAM_GET_PTS_DELAY: {
- int64_t *delay = va_arg(args, int64_t *);
- *delay = DEFAULT_PTS_DELAY;
- return VLC_SUCCESS;
- }
- case STREAM_SET_PAUSE_STATE:
- return VLC_SUCCESS;
-
- default:
- return VLC_EGENERIC;
- }
-}
-
-int RarAccessOpen(vlc_object_t *object)
-{
- access_t *access = (access_t*)object;
-
- const char *name = strchr(access->psz_location, '|');
- if (name == NULL)
- return VLC_EGENERIC;
-
- char *base = strndup(access->psz_location, name - access->psz_location);
- if (unlikely(base == NULL))
- return VLC_ENOMEM;
-
- name++;
- vlc_uri_decode(base);
-
- stream_t *s = vlc_stream_NewURL(access, base);
- if (!s || RarProbe(s))
- goto error;
-
- struct
- {
- int filescount;
- rar_file_t **files;
- unsigned int i_nbvols;
- } newscheme = { 0, NULL, 0 }, oldscheme = { 0, NULL, 0 }, *p_scheme;
-
- if (RarParse(s, &newscheme.filescount, &newscheme.files, &newscheme.i_nbvols, false)
- || newscheme.filescount < 1 || newscheme.i_nbvols < 2 )
- {
- /* We might want to lookup old naming scheme, could be a part1.rar,part1.r00 */
- vlc_stream_Seek(s, 0);
- RarParse(s, &oldscheme.filescount, &oldscheme.files, &oldscheme.i_nbvols, true);
- }
-
- if (oldscheme.filescount >= newscheme.filescount && oldscheme.i_nbvols > newscheme.i_nbvols)
- {
- for (int i = 0; i < newscheme.filescount; i++)
- RarFileDelete(newscheme.files[i]);
- free(newscheme.files);
- p_scheme = &oldscheme;
- msg_Dbg(s, "using rar old naming for %d files nbvols %u", p_scheme->filescount, oldscheme.i_nbvols);
- }
- else if (newscheme.filescount)
- {
- for (int i = 0; i < oldscheme.filescount; i++)
- RarFileDelete(oldscheme.files[i]);
- free(oldscheme.files);
- p_scheme = &newscheme;
- msg_Dbg(s, "using rar new naming for %d files nbvols %u", p_scheme->filescount, oldscheme.i_nbvols);
- }
- else
- {
- msg_Info(s, "Invalid or unsupported RAR archive");
- for (int i = 0; i < oldscheme.filescount; i++)
- RarFileDelete(oldscheme.files[i]);
- free(oldscheme.files);
- for (int i = 0; i < newscheme.filescount; i++)
- RarFileDelete(newscheme.files[i]);
- free(newscheme.files);
- goto error;
- }
-
- rar_file_t *file = NULL;
- for (int i = 0; i < p_scheme->filescount; i++) {
- if (!file && !strcmp(p_scheme->files[i]->name, name))
- file = p_scheme->files[i];
- else
- RarFileDelete(p_scheme->files[i]);
- }
- free(p_scheme->files);
- if (!file)
- goto error;
-
- access_sys_t *sys = access->p_sys = malloc(sizeof(*sys));
- sys->s = s;
- sys->file = file;
-
- access->pf_read = Read;
- access->pf_block = NULL;
- access->pf_control = Control;
- access->pf_seek = Seek;
-
- rar_file_chunk_t dummy = {
- .mrl = base,
- };
- sys->chunk = &dummy;
- Seek(access, 0);
-
- free(base);
- return VLC_SUCCESS;
-
-error:
- if (s)
- vlc_stream_Delete(s);
- free(base);
- return VLC_EGENERIC;
-}
-
-void RarAccessClose(vlc_object_t *object)
-{
- access_t *access = (access_t*)object;
- access_sys_t *sys = access->p_sys;
-
- if (sys->s)
- vlc_stream_Delete(sys->s);
- RarFileDelete(sys->file);
- free(sys);
-}
diff --git a/modules/access/rar/module.c b/modules/access/rar/module.c
deleted file mode 100644
index 20e6743..0000000
--- a/modules/access/rar/module.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/*****************************************************************************
- * stream.c: uncompressed RAR stream filter
- *****************************************************************************
- * Copyright (C) 2008-2010 Laurent Aimar
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
- *****************************************************************************/
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <vlc_common.h>
-#include <vlc_plugin.h>
-
-#include "rar.h"
-
-vlc_module_begin()
- set_category(CAT_INPUT)
- set_subcategory(SUBCAT_INPUT_STREAM_FILTER)
- set_description(N_("Uncompressed RAR"))
- set_capability("access", 0)
- set_callbacks(RarAccessOpen, RarAccessClose)
- add_submodule()
- set_capability("stream_filter", 15)
- set_callbacks(RarStreamOpen, RarStreamClose)
-vlc_module_end()
diff --git a/modules/access/rar/rar.c b/modules/access/rar/rar.c
deleted file mode 100644
index 76d596e..0000000
--- a/modules/access/rar/rar.c
+++ /dev/null
@@ -1,409 +0,0 @@
-/*****************************************************************************
- * rar.c: uncompressed RAR parser
- *****************************************************************************
- * Copyright (C) 2008-2010 Laurent Aimar
- * $Id$
- *
- * Author: Laurent Aimar <fenrir _AT_ videolan _DOT_ org>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
- *****************************************************************************/
-
-/*****************************************************************************
- * Preamble
- *****************************************************************************/
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <vlc_common.h>
-#include <vlc_plugin.h>
-#include <vlc_stream.h>
-
-#include <assert.h>
-#include <limits.h>
-
-#include "rar.h"
-
-static const uint8_t rar_marker[] = {
- 0x52, 0x61, 0x72, 0x21, 0x1a, 0x07, 0x00
-};
-static const int rar_marker_size = sizeof(rar_marker);
-
-void RarFileDelete(rar_file_t *file)
-{
- for (int i = 0; i < file->chunk_count; i++) {
- free(file->chunk[i]->mrl);
- free(file->chunk[i]);
- }
- free(file->chunk);
- free(file->name);
- free(file);
-}
-
-typedef struct {
- uint16_t crc;
- uint8_t type;
- uint16_t flags;
- uint16_t size;
- uint32_t add_size;
-} rar_block_t;
-
-enum {
- RAR_BLOCK_MARKER = 0x72,
- RAR_BLOCK_ARCHIVE = 0x73,
- RAR_BLOCK_FILE = 0x74,
- RAR_BLOCK_SUBBLOCK = 0x7a,
- RAR_BLOCK_END = 0x7b,
-};
-enum {
- RAR_BLOCK_END_HAS_NEXT = 0x0001,
-};
-enum {
- RAR_BLOCK_FILE_HAS_PREVIOUS = 0x0001,
- RAR_BLOCK_FILE_HAS_NEXT = 0x0002,
- RAR_BLOCK_FILE_HAS_HIGH = 0x0100,
-};
-
-static int PeekBlock(stream_t *s, rar_block_t *hdr)
-{
- const uint8_t *peek;
- int peek_size = vlc_stream_Peek(s, &peek, 11);
-
- if (peek_size < 7)
- return VLC_EGENERIC;
-
- hdr->crc = GetWLE(&peek[0]);
- hdr->type = peek[2];
- hdr->flags = GetWLE(&peek[3]);
- hdr->size = GetWLE(&peek[5]);
- hdr->add_size = 0;
- if ((hdr->flags & 0x8000) ||
- hdr->type == RAR_BLOCK_FILE ||
- hdr->type == RAR_BLOCK_SUBBLOCK) {
- if (peek_size < 11)
- return VLC_EGENERIC;
- hdr->add_size = GetDWLE(&peek[7]);
- }
-
- if (hdr->size < 7)
- return VLC_EGENERIC;
- return VLC_SUCCESS;
-}
-static int SkipBlock(stream_t *s, const rar_block_t *hdr)
-{
- uint64_t size = (uint64_t)hdr->size + hdr->add_size;
-
- while (size > 0) {
- int skip = __MIN(size, INT_MAX);
- if (vlc_stream_Read(s, NULL, skip) < skip)
- return VLC_EGENERIC;
-
- size -= skip;
- }
- return VLC_SUCCESS;
-}
-
-static int IgnoreBlock(stream_t *s, int block)
-{
- /* */
- rar_block_t bk;
- if (PeekBlock(s, &bk) || bk.type != block)
- return VLC_EGENERIC;
- return SkipBlock(s, &bk);
-}
-
-static int SkipEnd(stream_t *s, const rar_block_t *hdr)
-{
- if (!(hdr->flags & RAR_BLOCK_END_HAS_NEXT))
- return VLC_EGENERIC;
-
- if (SkipBlock(s, hdr))
- return VLC_EGENERIC;
-
- /* Now, we need to look for a marker block,
- * It seems that there is garbage at EOF */
- for (;;) {
- const uint8_t *peek;
-
- if (vlc_stream_Peek(s, &peek, rar_marker_size) < rar_marker_size)
- return VLC_EGENERIC;
-
- if (!memcmp(peek, rar_marker, rar_marker_size))
- break;
-
- if (vlc_stream_Read(s, NULL, 1) != 1)
- return VLC_EGENERIC;
- }
-
- /* Skip marker and archive blocks */
- if (IgnoreBlock(s, RAR_BLOCK_MARKER))
- return VLC_EGENERIC;
- if (IgnoreBlock(s, RAR_BLOCK_ARCHIVE))
- return VLC_EGENERIC;
-
- return VLC_SUCCESS;
-}
-
-static int SkipFile(stream_t *s, int *count, rar_file_t ***file,
- const rar_block_t *hdr, const char *volume_mrl)
-{
- const uint8_t *peek;
-
- int min_size = 7+21;
- if (hdr->flags & RAR_BLOCK_FILE_HAS_HIGH)
- min_size += 8;
- if (hdr->size < (unsigned)min_size)
- return VLC_EGENERIC;
-
- if (vlc_stream_Peek(s, &peek, min_size) < min_size)
- return VLC_EGENERIC;
-
- /* */
- uint32_t file_size_low = GetDWLE(&peek[7+4]);
- uint8_t method = peek[7+18];
- uint16_t name_size = GetWLE(&peek[7+19]);
- uint32_t file_size_high = 0;
- if (hdr->flags & RAR_BLOCK_FILE_HAS_HIGH)
- file_size_high = GetDWLE(&peek[7+29]);
- const uint64_t file_size = ((uint64_t)file_size_high << 32) | file_size_low;
-
- char *name = calloc(1, name_size + 1);
- if (!name)
- return VLC_EGENERIC;
-
- const int name_offset = (hdr->flags & RAR_BLOCK_FILE_HAS_HIGH) ? (7+33) : (7+25);
- if (name_offset + name_size <= hdr->size) {
- const int max_size = name_offset + name_size;
- if (vlc_stream_Peek(s, &peek, max_size) < max_size) {
- free(name);
- return VLC_EGENERIC;
- }
- memcpy(name, &peek[name_offset], name_size);
- }
-
- rar_file_t *current = NULL;
- if (method != 0x30) {
- msg_Dbg(s, "Ignoring compressed file %s (method=0x%2.2x)", name, method);
- goto exit;
- }
-
- /* */
- if( *count > 0 )
- current = (*file)[*count - 1];
-
- if (current &&
- (current->is_complete ||
- strcmp(current->name, name) ||
- (hdr->flags & RAR_BLOCK_FILE_HAS_PREVIOUS) == 0))
- current = NULL;
-
- if (!current) {
- if (hdr->flags & RAR_BLOCK_FILE_HAS_PREVIOUS)
- goto exit;
- current = malloc(sizeof(*current));
- if (!current)
- goto exit;
- TAB_APPEND(*count, *file, current);
-
- current->name = name;
- current->size = file_size;
- current->is_complete = false;
- current->real_size = 0;
- TAB_INIT(current->chunk_count, current->chunk);
-
- name = NULL;
- }
-
- /* Append chunks */
- rar_file_chunk_t *chunk = malloc(sizeof(*chunk));
- if (chunk) {
- chunk->mrl = strdup(volume_mrl);
- chunk->offset = vlc_stream_Tell(s) + hdr->size;
- chunk->size = hdr->add_size;
- chunk->cummulated_size = 0;
- if (current->chunk_count > 0) {
- rar_file_chunk_t *previous = current->chunk[current->chunk_count-1];
-
- chunk->cummulated_size += previous->cummulated_size +
- previous->size;
- }
-
- TAB_APPEND(current->chunk_count, current->chunk, chunk);
-
- current->real_size += hdr->add_size;
- }
- if ((hdr->flags & RAR_BLOCK_FILE_HAS_NEXT) == 0)
- current->is_complete = true;
-
-exit:
- /* */
- free(name);
-
- /* We stop on the first non empty file if we cannot seek */
- if (current) {
- bool can_seek = false;
- vlc_stream_Control(s, STREAM_CAN_SEEK, &can_seek);
- if (!can_seek && current->size > 0)
- return VLC_EGENERIC;
- }
-
- if (SkipBlock(s, hdr))
- return VLC_EGENERIC;
- return VLC_SUCCESS;
-}
-
-int RarProbe(stream_t *s)
-{
- const uint8_t *peek;
- if (vlc_stream_Peek(s, &peek, rar_marker_size) < rar_marker_size)
- return VLC_EGENERIC;
- if (memcmp(peek, rar_marker, rar_marker_size))
- return VLC_EGENERIC;
- return VLC_SUCCESS;
-}
-
-typedef struct {
- const char *match;
- const char *format;
- int start;
- int stop;
- bool b_extonly;
-} rar_pattern_t;
-
-static const rar_pattern_t *FindVolumePattern(const char *location, bool b_extonly )
-{
- static const rar_pattern_t patterns[] = {
- { ".part1.rar", "%s.part%.1d.rar", 2, 9, false }, // new naming
- { ".part01.rar", "%s.part%.2d.rar", 2, 99, false }, // new
- { ".part001.rar", "%s.part%.3d.rar", 2, 999, false }, // new
- { ".rar", "%s.%c%.2d", 0, 999, true }, // old
- { NULL, NULL, 0, 0, false },
- };
-
- const size_t location_size = strlen(location);
- for (int i = 0; patterns[i].match != NULL; i++) {
- const size_t match_size = strlen(patterns[i].match);
-
- if (location_size < match_size)
- continue;
-
- if ( b_extonly && !patterns[i].b_extonly )
- continue;
-
- if (!strcmp(&location[location_size - match_size], patterns[i].match))
- return &patterns[i];
- }
- return NULL;
-}
-
-int RarParse(stream_t *s, int *count, rar_file_t ***file, unsigned int *pi_nbvols,
- bool b_extonly)
-{
- *count = 0;
- *file = NULL;
- *pi_nbvols = 1;
-
- if( s->psz_url == NULL )
- return VLC_EGENERIC;
-
- const rar_pattern_t *pattern = FindVolumePattern(s->psz_url, b_extonly);
- int volume_offset = 0;
-
- char *volume_mrl = strdup(s->psz_url);
- if (volume_mrl == NULL)
- return VLC_ENOMEM;
-
- stream_t *vol = s;
- for (;;) {
- /* Skip marker & archive */
- if (IgnoreBlock(vol, RAR_BLOCK_MARKER) ||
- IgnoreBlock(vol, RAR_BLOCK_ARCHIVE)) {
- if (vol != s)
- vlc_stream_Delete(vol);
- free(volume_mrl);
- return VLC_EGENERIC;
- }
-
- /* */
- int has_next = -1;
- for (;;) {
- rar_block_t bk;
- int ret;
-
- if (PeekBlock(vol, &bk))
- break;
-
- switch(bk.type) {
- case RAR_BLOCK_END:
- ret = SkipEnd(vol, &bk);
- has_next = ret && (bk.flags & RAR_BLOCK_END_HAS_NEXT);
- break;
- case RAR_BLOCK_FILE:
- ret = SkipFile(vol, count, file, &bk, volume_mrl);
- break;
- default:
- ret = SkipBlock(vol, &bk);
- break;
- }
- if (ret)
- break;
- }
- if (has_next < 0 && *count > 0 && !(*file)[*count -1]->is_complete)
- has_next = 1;
- if (vol != s)
- vlc_stream_Delete(vol);
- free(volume_mrl);
-
- if (!has_next || !pattern)
- return VLC_SUCCESS;
-
- /* Open next volume */
- const int volume_index = pattern->start + volume_offset++;
- if (volume_index > pattern->stop)
- return VLC_SUCCESS;
-
- char *volume_base = strndup(s->psz_url,
- strlen(s->psz_url) - strlen(pattern->match));
- if (volume_base == NULL)
- return VLC_SUCCESS;
-
- if (pattern->start) {
- if (asprintf(&volume_mrl, pattern->format, volume_base, volume_index) < 0)
- volume_mrl = NULL;
- } else {
- if (asprintf(&volume_mrl, pattern->format, volume_base,
- 'r' + volume_index / 100, volume_index % 100) < 0)
- volume_mrl = NULL;
- }
- free(volume_base);
-
- if (!volume_mrl)
- return VLC_SUCCESS;
-
- const int s_flags = s->obj.flags;
- s->obj.flags |= OBJECT_FLAGS_NOINTERACT;
- vol = vlc_stream_NewURL(s, volume_mrl);
- s->obj.flags = s_flags;
-
- if (!vol) {
- free(volume_mrl);
- return VLC_SUCCESS;
- }
- (*pi_nbvols)++;
- }
-}
-
diff --git a/modules/access/rar/rar.h b/modules/access/rar/rar.h
deleted file mode 100644
index 6542d4c..0000000
--- a/modules/access/rar/rar.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*****************************************************************************
- * rar.h: uncompressed RAR parser
- *****************************************************************************
- * Copyright (C) 2008-2010 Laurent Aimar
- * $Id$
- *
- * Author: Laurent Aimar <fenrir _AT_ videolan _DOT_ org>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
- *****************************************************************************/
-
-typedef struct {
- char *mrl;
- uint64_t offset;
- uint64_t size;
- uint64_t cummulated_size;
-} rar_file_chunk_t;
-
-typedef struct {
- char *name;
- uint64_t size;
- bool is_complete;
-
- int chunk_count;
- rar_file_chunk_t **chunk;
- uint64_t real_size; /* Gathered size */
-} rar_file_t;
-
-int RarProbe(stream_t *);
-void RarFileDelete(rar_file_t *);
-int RarParse(stream_t *, int *, rar_file_t ***, unsigned int *, bool);
-
-int RarAccessOpen(vlc_object_t *);
-void RarAccessClose(vlc_object_t *);
-int RarStreamOpen(vlc_object_t *);
-void RarStreamClose(vlc_object_t *);
diff --git a/modules/access/rar/stream.c b/modules/access/rar/stream.c
deleted file mode 100644
index 1179ac1..0000000
--- a/modules/access/rar/stream.c
+++ /dev/null
@@ -1,162 +0,0 @@
-/*****************************************************************************
- * stream.c: uncompressed RAR stream filter
- *****************************************************************************
- * Copyright (C) 2008-2010 Laurent Aimar
- * $Id$
- *
- * Author: Laurent Aimar <fenrir _AT_ videolan _DOT_ org>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
- *****************************************************************************/
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <vlc_common.h>
-#include <vlc_plugin.h>
-#include <vlc_stream.h>
-#include <vlc_url.h>
-
-#include <assert.h>
-#include <limits.h>
-
-#include "rar.h"
-
-static ssize_t Read(stream_t *s, void *data, size_t size)
-{
- return vlc_stream_Read(s->p_sys, data, size);
-}
-
-static int Seek(stream_t *s, uint64_t offset)
-{
- return vlc_stream_Seek(s->p_sys, offset);
-}
-
-static int Control(stream_t *s, int query, va_list args)
-{
- switch (query) {
- case STREAM_GET_CONTENT_TYPE: {
- char **mime = va_arg(args, char **);
- *mime = strdup("audio/x-mpegurl");
- return VLC_SUCCESS;
- }
- default:
- return vlc_stream_vaControl(s->p_sys, query, args);
- }
-}
-
-int RarStreamOpen(vlc_object_t *object)
-{
- stream_t *s = (stream_t*)object;
-
- if( s->psz_url == NULL )
- return VLC_EGENERIC;
-
- if (RarProbe(s->p_source))
- return VLC_EGENERIC;
-
- struct
- {
- int filescount;
- rar_file_t **files;
- unsigned int i_nbvols;
- } newscheme = { 0, NULL, 0 }, oldscheme = { 0, NULL, 0 }, *p_scheme;
-
- const int64_t position = vlc_stream_Tell(s->p_source);
-
- if (RarParse(s->p_source, &newscheme.filescount, &newscheme.files, &newscheme.i_nbvols, false)
- || (newscheme.filescount < 2 && newscheme.i_nbvols < 2) )
- {
- /* We might want to lookup old naming scheme, could be a part1.rar,part1.r00 */
- vlc_stream_Seek(s->p_source, 0);
- RarParse(s->p_source, &oldscheme.filescount, &oldscheme.files, &oldscheme.i_nbvols, true );
- }
-
- if (oldscheme.filescount >= newscheme.filescount && oldscheme.i_nbvols > newscheme.i_nbvols)
- {
- free(newscheme.files);
- p_scheme = &oldscheme;
- }
- else if (newscheme.filescount)
- {
- free(oldscheme.files);
- p_scheme = &newscheme;
- }
- else
- {
- vlc_stream_Seek(s->p_source, position);
- msg_Info(s, "Invalid or unsupported RAR archive");
- free(oldscheme.files);
- free(newscheme.files);
- return VLC_EGENERIC;
- }
-
- /* TODO use xspf to have node for directories
- * Reusing WriteXSPF from the zip access is probably a good idea
- * (becareful about '\' and '/'.
- */
- char *base;
- char *encoded = vlc_uri_encode(s->psz_url);
- if (!encoded || asprintf(&base, "rar://%s", encoded) < 0)
- base = NULL;
- free(encoded);
-
- char *data = strdup("#EXTM3U\n");
- for (int i = 0; i < p_scheme->filescount; i++) {
- rar_file_t *f = p_scheme->files[i];
- char *next;
- if (base && data &&
- asprintf(&next, "%s"
- "#EXTINF:,,%s\n"
- "%s|%s\n",
- data, f->name, base, f->name) >= 0) {
- free(data);
- data = next;
- }
- RarFileDelete(f);
- }
- free(base);
- free(p_scheme->files);
- if (!data)
- return VLC_EGENERIC;
- stream_t *payload = vlc_stream_MemoryNew(s, (uint8_t*)data, strlen(data), false);
- if (!payload) {
- free(data);
- return VLC_EGENERIC;
- }
-
- s->pf_read = Read;
- s->pf_seek = Seek;
- s->pf_control = Control;
- s->p_sys = payload;
-
- char *tmp;
- if (asprintf(&tmp, "%s.m3u", s->psz_url) < 0) {
- RarStreamClose(object);
- return VLC_ENOMEM;
- }
- free(s->psz_url);
- s->psz_url = tmp;
-
- return VLC_SUCCESS;
-}
-
-void RarStreamClose(vlc_object_t *object)
-{
- stream_t *s = (stream_t*)object;
-
- vlc_stream_Delete(s->p_sys);
-}
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 08bf6d7..4122cf6 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -226,10 +226,6 @@ modules/access_output/livehttp.c
modules/access_output/shout.c
modules/access_output/udp.c
modules/access/pulse.c
-modules/access/rar/access.c
-modules/access/rar/rar.c
-modules/access/rar/rar.h
-modules/access/rar/stream.c
modules/access/rdp.c
modules/access/rtp/input.c
modules/access/rtp/rtp.c
More information about the vlc-commits
mailing list