|
|
@@ -26,6 +26,7 @@ |
|
|
|
|
|
|
|
|
typedef struct ThpDemuxContext { |
|
|
typedef struct ThpDemuxContext { |
|
|
int version; |
|
|
int version; |
|
|
|
|
|
unsigned data_size; |
|
|
int first_frame; |
|
|
int first_frame; |
|
|
int first_framesz; |
|
|
int first_framesz; |
|
|
int last_frame; |
|
|
int last_frame; |
|
|
@@ -41,7 +42,7 @@ typedef struct ThpDemuxContext { |
|
|
unsigned char components[16]; |
|
|
unsigned char components[16]; |
|
|
AVStream* vst; |
|
|
AVStream* vst; |
|
|
int has_audio; |
|
|
int has_audio; |
|
|
int audiosize; |
|
|
|
|
|
|
|
|
unsigned audiosize; |
|
|
} ThpDemuxContext; |
|
|
} ThpDemuxContext; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -60,6 +61,7 @@ static int thp_read_header(AVFormatContext *s, |
|
|
ThpDemuxContext *thp = s->priv_data; |
|
|
ThpDemuxContext *thp = s->priv_data; |
|
|
AVStream *st; |
|
|
AVStream *st; |
|
|
AVIOContext *pb = s->pb; |
|
|
AVIOContext *pb = s->pb; |
|
|
|
|
|
int64_t fsize= avio_size(pb); |
|
|
int i; |
|
|
int i; |
|
|
|
|
|
|
|
|
/* Read the file header. */ |
|
|
/* Read the file header. */ |
|
|
@@ -72,7 +74,9 @@ static int thp_read_header(AVFormatContext *s, |
|
|
thp->fps = av_d2q(av_int2float(avio_rb32(pb)), INT_MAX); |
|
|
thp->fps = av_d2q(av_int2float(avio_rb32(pb)), INT_MAX); |
|
|
thp->framecnt = avio_rb32(pb); |
|
|
thp->framecnt = avio_rb32(pb); |
|
|
thp->first_framesz = avio_rb32(pb); |
|
|
thp->first_framesz = avio_rb32(pb); |
|
|
avio_rb32(pb); /* Data size. */ |
|
|
|
|
|
|
|
|
thp->data_size = avio_rb32(pb); |
|
|
|
|
|
if(fsize>0 && (!thp->data_size || fsize < thp->data_size)) |
|
|
|
|
|
thp->data_size= fsize; |
|
|
|
|
|
|
|
|
thp->compoff = avio_rb32(pb); |
|
|
thp->compoff = avio_rb32(pb); |
|
|
avio_rb32(pb); /* offsetDataOffset. */ |
|
|
avio_rb32(pb); /* offsetDataOffset. */ |
|
|
@@ -143,7 +147,7 @@ static int thp_read_packet(AVFormatContext *s, |
|
|
{ |
|
|
{ |
|
|
ThpDemuxContext *thp = s->priv_data; |
|
|
ThpDemuxContext *thp = s->priv_data; |
|
|
AVIOContext *pb = s->pb; |
|
|
AVIOContext *pb = s->pb; |
|
|
int size; |
|
|
|
|
|
|
|
|
unsigned int size; |
|
|
int ret; |
|
|
int ret; |
|
|
|
|
|
|
|
|
if (thp->audiosize == 0) { |
|
|
if (thp->audiosize == 0) { |
|
|
@@ -159,6 +163,10 @@ static int thp_read_packet(AVFormatContext *s, |
|
|
|
|
|
|
|
|
avio_rb32(pb); /* Previous total size. */ |
|
|
avio_rb32(pb); /* Previous total size. */ |
|
|
size = avio_rb32(pb); /* Total size of this frame. */ |
|
|
size = avio_rb32(pb); /* Total size of this frame. */ |
|
|
|
|
|
if(thp->data_size && avio_tell(pb) + size > thp->data_size) { |
|
|
|
|
|
av_log(s, AV_LOG_ERROR, "Video packet truncated\n"); |
|
|
|
|
|
size= thp->data_size - avio_tell(pb); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/* Store the audiosize so the next time this function is called, |
|
|
/* Store the audiosize so the next time this function is called, |
|
|
the audio can be read. */ |
|
|
the audio can be read. */ |
|
|
@@ -175,6 +183,11 @@ static int thp_read_packet(AVFormatContext *s, |
|
|
|
|
|
|
|
|
pkt->stream_index = thp->video_stream_index; |
|
|
pkt->stream_index = thp->video_stream_index; |
|
|
} else { |
|
|
} else { |
|
|
|
|
|
if(thp->data_size && avio_tell(pb) + thp->audiosize > thp->data_size){ |
|
|
|
|
|
av_log(s, AV_LOG_ERROR, "Audio packet truncated\n"); |
|
|
|
|
|
thp->audiosize= thp->data_size - avio_tell(pb); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
ret = av_get_packet(pb, pkt, thp->audiosize); |
|
|
ret = av_get_packet(pb, pkt, thp->audiosize); |
|
|
if (ret != thp->audiosize) { |
|
|
if (ret != thp->audiosize) { |
|
|
av_free_packet(pkt); |
|
|
av_free_packet(pkt); |
|
|
|