diff options
author | Diego 'Flameeyes' Pettenò <flameeyes@gmail.com> | 2008-03-01 03:05:13 +0100 |
---|---|---|
committer | Diego 'Flameeyes' Pettenò <flameeyes@gmail.com> | 2008-03-01 03:05:13 +0100 |
commit | 1d0b3b20c34517b9d1ddf3ea347776304b0c4b44 (patch) | |
tree | 89f4fc640c2becc6f00ae08996754952ecf149c1 /contrib/ffmpeg/libavformat/nuv.c | |
parent | 09496ad3469a0ade8dbd9a351e639b78f20b7942 (diff) | |
download | xine-lib-1d0b3b20c34517b9d1ddf3ea347776304b0c4b44.tar.gz xine-lib-1d0b3b20c34517b9d1ddf3ea347776304b0c4b44.tar.bz2 |
Update internal FFmpeg copy.
Diffstat (limited to 'contrib/ffmpeg/libavformat/nuv.c')
-rw-r--r-- | contrib/ffmpeg/libavformat/nuv.c | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/contrib/ffmpeg/libavformat/nuv.c b/contrib/ffmpeg/libavformat/nuv.c index 7e04222ee..f56d116ff 100644 --- a/contrib/ffmpeg/libavformat/nuv.c +++ b/contrib/ffmpeg/libavformat/nuv.c @@ -24,6 +24,7 @@ typedef struct { int v_id; int a_id; + int rtjpg_video; } NUVContext; typedef enum { @@ -35,8 +36,6 @@ typedef enum { } frametype_t; static int nuv_probe(AVProbeData *p) { - if (p->buf_size < 12) - return 0; if (!memcmp(p->buf, "NuppelVideo", 12)) return AVPROBE_SCORE_MAX; if (!memcmp(p->buf, "MythTVVideo", 12)) @@ -86,6 +85,8 @@ static int get_codec_data(ByteIOContext *pb, AVStream *vst, vst->codec->codec_tag = get_le32(pb); vst->codec->codec_id = codec_get_id(codec_bmp_tags, vst->codec->codec_tag); + if (vst->codec->codec_tag == MKTAG('R', 'J', 'P', 'G')) + vst->codec->codec_id = CODEC_ID_NUV; } else url_fskip(pb, 4); @@ -97,6 +98,7 @@ static int get_codec_data(ByteIOContext *pb, AVStream *vst, ast->codec->codec_id = wav_codec_get_id(ast->codec->codec_tag, ast->codec->bits_per_sample); + ast->need_parsing = AVSTREAM_PARSE_FULL; } else url_fskip(pb, 4 * 4); @@ -117,8 +119,8 @@ static int get_codec_data(ByteIOContext *pb, AVStream *vst, } static int nuv_header(AVFormatContext *s, AVFormatParameters *ap) { - NUVContext *ctx = (NUVContext *)s->priv_data; - ByteIOContext *pb = &s->pb; + NUVContext *ctx = s->priv_data; + ByteIOContext *pb = s->pb; char id_string[12], version_string[5]; double aspect, fps; int is_mythtv, width, height, v_packs, a_packs; @@ -149,7 +151,6 @@ static int nuv_header(AVFormatContext *s, AVFormatParameters *ap) { vst = av_new_stream(s, ctx->v_id); vst->codec->codec_type = CODEC_TYPE_VIDEO; vst->codec->codec_id = CODEC_ID_NUV; - vst->codec->codec_tag = MKTAG('R', 'J', 'P', 'G'); vst->codec->width = width; vst->codec->height = height; vst->codec->bits_per_sample = 10; @@ -174,39 +175,45 @@ static int nuv_header(AVFormatContext *s, AVFormatParameters *ap) { ctx->a_id = -1; get_codec_data(pb, vst, ast, is_mythtv); + ctx->rtjpg_video = vst->codec->codec_id == CODEC_ID_NUV; return 0; } #define HDRSIZE 12 static int nuv_packet(AVFormatContext *s, AVPacket *pkt) { - NUVContext *ctx = (NUVContext *)s->priv_data; - ByteIOContext *pb = &s->pb; + NUVContext *ctx = s->priv_data; + ByteIOContext *pb = s->pb; uint8_t hdr[HDRSIZE]; frametype_t frametype; int ret, size; while (!url_feof(pb)) { + int copyhdrsize = ctx->rtjpg_video ? HDRSIZE : 0; ret = get_buffer(pb, hdr, HDRSIZE); if (ret <= 0) return ret ? ret : -1; frametype = hdr[0]; size = PKTSIZE(AV_RL32(&hdr[8])); switch (frametype) { - case NUV_VIDEO: case NUV_EXTRADATA: + if (!ctx->rtjpg_video) { + url_fskip(pb, size); + break; + } + case NUV_VIDEO: if (ctx->v_id < 0) { av_log(s, AV_LOG_ERROR, "Video packet in file without video stream!\n"); url_fskip(pb, size); break; } - ret = av_new_packet(pkt, HDRSIZE + size); + ret = av_new_packet(pkt, copyhdrsize + size); if (ret < 0) return ret; - pkt->pos = url_ftell(pb); + pkt->pos = url_ftell(pb) - copyhdrsize; pkt->pts = AV_RL32(&hdr[4]); pkt->stream_index = ctx->v_id; - memcpy(pkt->data, hdr, HDRSIZE); - ret = get_buffer(pb, pkt->data + HDRSIZE, size); + memcpy(pkt->data, hdr, copyhdrsize); + ret = get_buffer(pb, pkt->data + copyhdrsize, size); return ret; case NUV_AUDIO: if (ctx->a_id < 0) { @@ -226,7 +233,7 @@ static int nuv_packet(AVFormatContext *s, AVPacket *pkt) { break; } } - return AVERROR_IO; + return AVERROR(EIO); } AVInputFormat nuv_demuxer = { |