Mercurial > libavformat.hg
changeset 2536:fb7c72af3a61 libavformat
Copy nuv header only when the video codec is nuv
author | reimar |
---|---|
date | Sun, 09 Sep 2007 07:25:52 +0000 |
parents | 2ede5472f331 |
children | 46fc89be5b52 |
files | nuv.c |
diffstat | 1 files changed, 13 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/nuv.c Fri Sep 07 13:49:44 2007 +0000 +++ b/nuv.c Sun Sep 09 07:25:52 2007 +0000 @@ -24,6 +24,7 @@ typedef struct { int v_id; int a_id; + int rtjpg_video; } NUVContext; typedef enum { @@ -173,6 +174,8 @@ ctx->a_id = -1; get_codec_data(pb, vst, ast, is_mythtv); + ctx->rtjpg_video = vst->codec->codec_id == CODEC_ID_NUV; + ctx->rtjpg_video |= vst->codec->codec_tag == MKTAG('R', 'J', 'P', 'G'); return 0; } @@ -185,27 +188,32 @@ 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_EXTRADATA: + if (!ctx->rtjpg_video) { + url_fskip(pb, size); + break; + } case NUV_VIDEO: - case NUV_EXTRADATA: 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) {