|
|
@ -24,6 +24,7 @@ |
|
|
|
#include "avformat.h" |
|
|
|
#include "avformat.h" |
|
|
|
#include "riff.h" |
|
|
|
#include "riff.h" |
|
|
|
#include "isom.h" |
|
|
|
#include "isom.h" |
|
|
|
|
|
|
|
#include "dv.h" |
|
|
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_ZLIB |
|
|
|
#ifdef CONFIG_ZLIB |
|
|
|
#include <zlib.h> |
|
|
|
#include <zlib.h> |
|
|
@ -144,6 +145,8 @@ static const CodecTag mov_audio_tags[] = { |
|
|
|
{ CODEC_ID_AC3, MKTAG('m', 's', 0x20, 0x00) }, /* Dolby AC-3 */ |
|
|
|
{ CODEC_ID_AC3, MKTAG('m', 's', 0x20, 0x00) }, /* Dolby AC-3 */ |
|
|
|
{ CODEC_ID_ALAC,MKTAG('a', 'l', 'a', 'c') }, /* Apple Lossless */ |
|
|
|
{ CODEC_ID_ALAC,MKTAG('a', 'l', 'a', 'c') }, /* Apple Lossless */ |
|
|
|
{ CODEC_ID_QDM2,MKTAG('Q', 'D', 'M', '2') }, /* QDM2 */ |
|
|
|
{ CODEC_ID_QDM2,MKTAG('Q', 'D', 'M', '2') }, /* QDM2 */ |
|
|
|
|
|
|
|
{ CODEC_ID_DVAUDIO, MKTAG('v', 'd', 'v', 'a') }, |
|
|
|
|
|
|
|
{ CODEC_ID_DVAUDIO, MKTAG('d', 'v', 'c', 'a') }, |
|
|
|
{ CODEC_ID_NONE, 0 }, |
|
|
|
{ CODEC_ID_NONE, 0 }, |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
@ -250,6 +253,7 @@ typedef struct MOVStreamContext { |
|
|
|
long current_sample; |
|
|
|
long current_sample; |
|
|
|
MOV_esds_t esds; |
|
|
|
MOV_esds_t esds; |
|
|
|
AVRational sample_size_v1; |
|
|
|
AVRational sample_size_v1; |
|
|
|
|
|
|
|
int dv_audio_container; |
|
|
|
} MOVStreamContext; |
|
|
|
} MOVStreamContext; |
|
|
|
|
|
|
|
|
|
|
|
typedef struct MOVContext { |
|
|
|
typedef struct MOVContext { |
|
|
@ -275,6 +279,8 @@ typedef struct MOVContext { |
|
|
|
AVPaletteControl palette_control; |
|
|
|
AVPaletteControl palette_control; |
|
|
|
MOV_mdat_atom_t *mdat_list; |
|
|
|
MOV_mdat_atom_t *mdat_list; |
|
|
|
int mdat_count; |
|
|
|
int mdat_count; |
|
|
|
|
|
|
|
DVDemuxContext *dv_demux; |
|
|
|
|
|
|
|
AVFormatContext *dv_fctx; |
|
|
|
} MOVContext; |
|
|
|
} MOVContext; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -1033,6 +1039,16 @@ static int mov_read_stsd(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom) |
|
|
|
case CODEC_ID_MP3ON4: |
|
|
|
case CODEC_ID_MP3ON4: |
|
|
|
st->codec->sample_rate= 0; /* let decoder init parameters properly */ |
|
|
|
st->codec->sample_rate= 0; /* let decoder init parameters properly */ |
|
|
|
break; |
|
|
|
break; |
|
|
|
|
|
|
|
case CODEC_ID_DVAUDIO: |
|
|
|
|
|
|
|
c->dv_fctx = av_alloc_format_context(); |
|
|
|
|
|
|
|
c->dv_demux = dv_init_demux(c->dv_fctx); |
|
|
|
|
|
|
|
if (!c->dv_demux) { |
|
|
|
|
|
|
|
av_log(c->fc, AV_LOG_ERROR, "dv demux context init error\n"); |
|
|
|
|
|
|
|
return -1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
sc->dv_audio_container = 1; |
|
|
|
|
|
|
|
st->codec->codec_id = CODEC_ID_PCM_S16LE; |
|
|
|
|
|
|
|
break; |
|
|
|
default: |
|
|
|
default: |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
@ -1522,7 +1538,7 @@ static void mov_build_index(MOVContext *mov, AVStream *st) |
|
|
|
int stss_index = 0; |
|
|
|
int stss_index = 0; |
|
|
|
int i, j, k; |
|
|
|
int i, j, k; |
|
|
|
|
|
|
|
|
|
|
|
if (sc->sample_sizes || st->codec->codec_type == CODEC_TYPE_VIDEO) { |
|
|
|
if (sc->sample_sizes || st->codec->codec_type == CODEC_TYPE_VIDEO || sc->dv_audio_container) { |
|
|
|
int keyframe, sample_size; |
|
|
|
int keyframe, sample_size; |
|
|
|
int current_sample = 0; |
|
|
|
int current_sample = 0; |
|
|
|
int stts_sample = 0; |
|
|
|
int stts_sample = 0; |
|
|
@ -1712,8 +1728,19 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt) |
|
|
|
av_log(mov->fc, AV_LOG_ERROR, "stream %d, offset 0x%llx: partial file\n", sc->ffindex, sample->pos); |
|
|
|
av_log(mov->fc, AV_LOG_ERROR, "stream %d, offset 0x%llx: partial file\n", sc->ffindex, sample->pos); |
|
|
|
return -1; |
|
|
|
return -1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (sc->dv_audio_container) { |
|
|
|
|
|
|
|
dv_get_packet(mov->dv_demux, pkt); |
|
|
|
|
|
|
|
dprintf("dv audio pkt size %d\n", pkt->size); |
|
|
|
|
|
|
|
} else { |
|
|
|
url_fseek(&s->pb, sample->pos, SEEK_SET); |
|
|
|
url_fseek(&s->pb, sample->pos, SEEK_SET); |
|
|
|
av_get_packet(&s->pb, pkt, sample->size); |
|
|
|
av_get_packet(&s->pb, pkt, sample->size); |
|
|
|
|
|
|
|
if (mov->dv_demux) { |
|
|
|
|
|
|
|
void *pkt_destruct_func = pkt->destruct; |
|
|
|
|
|
|
|
dv_produce_packet(mov->dv_demux, pkt, pkt->data, pkt->size); |
|
|
|
|
|
|
|
pkt->destruct = pkt_destruct_func; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
pkt->stream_index = sc->ffindex; |
|
|
|
pkt->stream_index = sc->ffindex; |
|
|
|
pkt->dts = sample->timestamp; |
|
|
|
pkt->dts = sample->timestamp; |
|
|
|
if (sc->ctts_data) { |
|
|
|
if (sc->ctts_data) { |
|
|
@ -1799,6 +1826,14 @@ static int mov_read_close(AVFormatContext *s) |
|
|
|
/* free color tabs */ |
|
|
|
/* free color tabs */ |
|
|
|
for(i=0; i<mov->ctab_size; i++) |
|
|
|
for(i=0; i<mov->ctab_size; i++) |
|
|
|
av_freep(&mov->ctab[i]); |
|
|
|
av_freep(&mov->ctab[i]); |
|
|
|
|
|
|
|
if(mov->dv_demux){ |
|
|
|
|
|
|
|
for(i=0; i<mov->dv_fctx->nb_streams; i++){ |
|
|
|
|
|
|
|
av_freep(&mov->dv_fctx->streams[i]->codec); |
|
|
|
|
|
|
|
av_freep(&mov->dv_fctx->streams[i]); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
av_freep(&mov->dv_fctx); |
|
|
|
|
|
|
|
av_freep(&mov->dv_demux); |
|
|
|
|
|
|
|
} |
|
|
|
av_freep(&mov->ctab); |
|
|
|
av_freep(&mov->ctab); |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|