diff options
author | Fabrice Bellard <fabrice@bellard.org> | 2003-01-27 09:21:30 +0000 |
---|---|---|
committer | Fabrice Bellard <fabrice@bellard.org> | 2003-01-27 09:21:30 +0000 |
commit | 425ed6e223b8dd190e9fbeb4a41c6479f3fc8df0 (patch) | |
tree | 57fbdc23c600efc2cc0f99df119b9a2752b9ac5a /libavformat/dv.c | |
parent | 850742d785cd566204b112d77c018e9f2b701239 (diff) | |
download | ffmpeg-streaming-425ed6e223b8dd190e9fbeb4a41c6479f3fc8df0.zip ffmpeg-streaming-425ed6e223b8dd190e9fbeb4a41c6479f3fc8df0.tar.gz |
DV audio decoder by Roman Shaposhnick
Originally committed as revision 1514 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/dv.c')
-rw-r--r-- | libavformat/dv.c | 52 |
1 files changed, 29 insertions, 23 deletions
diff --git a/libavformat/dv.c b/libavformat/dv.c index d6d5fd9..64cc0be 100644 --- a/libavformat/dv.c +++ b/libavformat/dv.c @@ -22,15 +22,17 @@ #define PAL_FRAME_SIZE 144000 typedef struct DVDemuxContext { - int is_audio; + int is_audio; + uint8_t buf[PAL_FRAME_SIZE]; + int size; } DVDemuxContext; /* raw input */ static int dv_read_header(AVFormatContext *s, AVFormatParameters *ap) { - AVStream *vst; - // AVStream *ast; + AVStream *vst, *ast; + DVDemuxContext *c = s->priv_data; vst = av_new_stream(s, 0); if (!vst) @@ -38,42 +40,46 @@ static int dv_read_header(AVFormatContext *s, vst->codec.codec_type = CODEC_TYPE_VIDEO; vst->codec.codec_id = CODEC_ID_DVVIDEO; -#if 0 + ast = av_new_stream(s, 1); if (!ast) return AVERROR_NOMEM; ast->codec.codec_type = CODEC_TYPE_AUDIO; ast->codec.codec_id = CODEC_ID_DVAUDIO; -#endif + ast->codec.channels = 2; + c->is_audio = 0; + return 0; } /* XXX: build fake audio stream when DV audio decoder will be finished */ static int dv_read_packet(AVFormatContext *s, AVPacket *pkt) { - int ret, size, dsf; - uint8_t buf[4]; + int ret, dsf; + DVDemuxContext *c = s->priv_data; - ret = get_buffer(&s->pb, buf, 4); - if (ret <= 0) - return -EIO; - dsf = buf[3] & 0x80; - if (!dsf) - size = NTSC_FRAME_SIZE; - else - size = PAL_FRAME_SIZE; + if (!c->is_audio) { + ret = get_buffer(&s->pb, c->buf, 4); + if (ret <= 0) + return -EIO; + dsf = c->buf[3] & 0x80; + if (!dsf) + c->size = NTSC_FRAME_SIZE; + else + c->size = PAL_FRAME_SIZE; + + ret = get_buffer(&s->pb, c->buf + 4, c->size - 4); + if (ret <= 0) + return -EIO; + } - if (av_new_packet(pkt, size) < 0) + if (av_new_packet(pkt, c->size) < 0) return -EIO; - pkt->stream_index = 0; - memcpy(pkt->data, buf, 4); - ret = get_buffer(&s->pb, pkt->data + 4, size - 4); - if (ret <= 0) { - av_free_packet(pkt); - return -EIO; - } + pkt->stream_index = c->is_audio; + c->is_audio = !c->is_audio; + memcpy(pkt->data, c->buf, c->size); return ret; } |