mirror of
https://github.com/mpv-player/mpv
synced 2024-12-23 23:32:26 +00:00
2aa5964b43
The header probing hacks were previously all broken. They only worked the first time the archive file was open. Since subsequent opens (on seek) occured in the middle of the source stream rather than at the beginning, the stream_read_peek calls meant to retrieve the headers were instead returning random bytes in the middle of the file. Perhaps the worst manifestation of this was when seeking within a multi-volume .rar archive with the "legacy" file naming pattern. If the seek required a reopen, the fact that the archive was multi-volume would be forgotten and the file would appear truncated terminating playback. To solve this, only perform the header probling the first time the archive is opened. Save the results and reuse them on subsequent reopens. Put this in a wrapper so this is transparent to demux_libarchive.
36 lines
872 B
C
36 lines
872 B
C
#include <locale.h>
|
|
#include "osdep/io.h"
|
|
|
|
#ifdef __APPLE__
|
|
# include <string.h>
|
|
# include <xlocale.h>
|
|
#endif
|
|
|
|
struct mp_log;
|
|
|
|
struct mp_archive {
|
|
locale_t locale;
|
|
struct mp_log *log;
|
|
struct archive *arch;
|
|
struct stream *primary_src;
|
|
char buffer[4096];
|
|
int flags;
|
|
int num_volumes; // INT_MAX if unknown (initial state)
|
|
|
|
// Current entry, as set by mp_archive_next_entry().
|
|
struct archive_entry *entry;
|
|
char *entry_filename;
|
|
int entry_num;
|
|
};
|
|
|
|
void mp_archive_free(struct mp_archive *mpa);
|
|
|
|
#define MP_ARCHIVE_FLAG_UNSAFE (1 << 0)
|
|
#define MP_ARCHIVE_FLAG_NO_VOLUMES (1 << 1)
|
|
#define MP_ARCHIVE_FLAG_PRIV (1 << 2)
|
|
|
|
struct mp_archive *mp_archive_new(struct mp_log *log, struct stream *src,
|
|
int flags, int max_volumes);
|
|
|
|
bool mp_archive_next_entry(struct mp_archive *mpa);
|