The previous commit changed is_divx to a bool which is wrong. Restored the rederive keyframes functionality.

This commit is contained in:
Moritz Bunkus 2005-10-04 18:36:59 +00:00
parent 8b41e3f949
commit 854c0e60a7
2 changed files with 14 additions and 13 deletions

View File

@ -75,9 +75,10 @@ avi_reader_c::probe_file(mm_io_c *io,
avi_reader_c::avi_reader_c(track_info_c &_ti) avi_reader_c::avi_reader_c(track_info_c &_ti)
throw (error_c): throw (error_c):
generic_reader_c(_ti), generic_reader_c(_ti),
divx_type(DIVX_TYPE_NONE),
avi(NULL), vptzr(-1), avi(NULL), vptzr(-1),
fps(1.0), video_frames_read(0), max_video_frames(0), dropped_video_frames(0), fps(1.0), video_frames_read(0), max_video_frames(0), dropped_video_frames(0),
act_wchar(0), is_divx(false), rederive_keyframes(false), act_wchar(0), rederive_keyframes(false),
bytes_to_process(0), bytes_processed(0) { bytes_to_process(0), bytes_processed(0) {
int64_t size; int64_t size;
@ -136,17 +137,15 @@ avi_reader_c::create_packetizer(int64_t tid) {
!strcasecmp(codec, "AP41") || // Angel Potion !strcasecmp(codec, "AP41") || // Angel Potion
!strcasecmp(codec, "MPG3") || !strcasecmp(codec, "MPG3") ||
!strcasecmp(codec, "MP43")) !strcasecmp(codec, "MP43"))
is_divx = RAVI_DIVX3; divx_type = DIVX_TYPE_V3;
else if (is_mpeg4_p2_fourcc(codec)) else if (is_mpeg4_p2_fourcc(codec))
is_divx = RAVI_MPEG4; divx_type = DIVX_TYPE_MPEG4;
else
is_divx = 0;
ti.private_data = (unsigned char *)avi->bitmap_info_header; ti.private_data = (unsigned char *)avi->bitmap_info_header;
if (ti.private_data != NULL) if (ti.private_data != NULL)
ti.private_size = get_uint32_le(&avi->bitmap_info_header->bi_size); ti.private_size = get_uint32_le(&avi->bitmap_info_header->bi_size);
ti.id = 0; // ID for the video track. ti.id = 0; // ID for the video track.
if (is_divx == RAVI_MPEG4) { if (divx_type == DIVX_TYPE_MPEG4) {
vptzr = vptzr =
add_packetizer(new mpeg4_p2_video_packetizer_c(this, add_packetizer(new mpeg4_p2_video_packetizer_c(this,
AVI_frame_rate(avi), AVI_frame_rate(avi),
@ -320,11 +319,11 @@ avi_reader_c::is_keyframe(unsigned char *data,
if (!rederive_keyframes) if (!rederive_keyframes)
return suggestion; return suggestion;
switch (is_divx) { switch (divx_type) {
case RAVI_DIVX3: case DIVX_TYPE_V3:
i = *((int *)data); i = *((int *)data);
return ((i & 0x40000000) ? 0 : 1); return ((i & 0x40000000) ? 0 : 1);
case RAVI_MPEG4: case DIVX_TYPE_MPEG4:
for (i = 0; i < size - 5; i++) { for (i = 0; i < size - 5; i++) {
if ((data[i] == 0x00) && (data[i + 1] == 0x00) && if ((data[i] == 0x00) && (data[i + 1] == 0x00) &&
(data[i + 2] == 0x01)) { (data[i + 2] == 0x01)) {

View File

@ -31,10 +31,6 @@ extern "C" {
#include "common.h" #include "common.h"
#include "error.h" #include "error.h"
#define RAVI_UNKNOWN 0
#define RAVI_DIVX3 1
#define RAVI_MPEG4 2
typedef struct avi_demuxer_t { typedef struct avi_demuxer_t {
int ptzr; int ptzr;
int channels, bits_per_sample, samples_per_second, aid; int channels, bits_per_sample, samples_per_second, aid;
@ -43,6 +39,12 @@ typedef struct avi_demuxer_t {
class avi_reader_c: public generic_reader_c { class avi_reader_c: public generic_reader_c {
private: private:
enum divx_type_e {
DIVX_TYPE_NONE,
DIVX_TYPE_V3,
DIVX_TYPE_MPEG4
} divx_type;
avi_t *avi; avi_t *avi;
int vptzr; int vptzr;
vector<avi_demuxer_t> ademuxers; vector<avi_demuxer_t> ademuxers;