X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fraw.c;h=d4b138953734813ceb174245f777d0d00ed1b83a;hb=61559562f52f9cfaf050500342c5bbba9ece3ce9;hp=e3d460fafb4ab83eb9fa6c9c876739b2334ced91;hpb=7a97dd84e312777c36cbf3442d85805a9ee5df5b;p=ffmpeg diff --git a/libavformat/raw.c b/libavformat/raw.c index e3d460fafb4..d4b13895373 100644 --- a/libavformat/raw.c +++ b/libavformat/raw.c @@ -21,6 +21,7 @@ */ #include "avformat.h" #include "ac3_parser.h" +#include "raw.h" #ifdef CONFIG_MUXERS /* simple formats */ @@ -32,8 +33,8 @@ static int flac_write_header(struct AVFormatContext *s) uint8_t *streaminfo = s->streams[0]->codec->extradata; int len = s->streams[0]->codec->extradata_size; if(streaminfo != NULL && len > 0) { - put_buffer(&s->pb, header, 8); - put_buffer(&s->pb, streaminfo, len); + put_buffer(s->pb, header, 8); + put_buffer(s->pb, streaminfo, len); } return 0; } @@ -45,16 +46,16 @@ static int roq_write_header(struct AVFormatContext *s) 0x84, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0x1E, 0x00 }; - put_buffer(&s->pb, header, 8); - put_flush_packet(&s->pb); + put_buffer(s->pb, header, 8); + put_flush_packet(s->pb); return 0; } static int raw_write_packet(struct AVFormatContext *s, AVPacket *pkt) { - put_buffer(&s->pb, pkt->data, pkt->size); - put_flush_packet(&s->pb); + put_buffer(s->pb, pkt->data, pkt->size); + put_flush_packet(s->pb); return 0; } #endif //CONFIG_MUXERS @@ -84,7 +85,10 @@ static int raw_read_header(AVFormatContext *s, AVFormatParameters *ap) av_set_pts_info(st, 64, 1, st->codec->sample_rate); break; case CODEC_TYPE_VIDEO: - av_set_pts_info(st, 64, ap->time_base.num, ap->time_base.den); + if(ap->time_base.num) + av_set_pts_info(st, 64, ap->time_base.num, ap->time_base.den); + else + av_set_pts_info(st, 64, 1, 25); st->codec->width = ap->width; st->codec->height = ap->height; st->codec->pix_fmt = ap->pix_fmt; @@ -101,12 +105,12 @@ static int raw_read_header(AVFormatContext *s, AVFormatParameters *ap) static int raw_read_packet(AVFormatContext *s, AVPacket *pkt) { - int ret, size; + int ret, size, bps; // AVStream *st = s->streams[0]; size= RAW_PACKET_SIZE; - ret= av_get_packet(&s->pb, pkt, size); + ret= av_get_packet(s->pb, pkt, size); pkt->stream_index = 0; if (ret <= 0) { @@ -115,6 +119,12 @@ static int raw_read_packet(AVFormatContext *s, AVPacket *pkt) /* note: we need to modify the packet size here to handle the last packet */ pkt->size = ret; + + bps= av_get_bits_per_sample(s->streams[0]->codec->codec_id); + assert(bps); // if false there IS a bug elsewhere (NOT in this function) + pkt->dts= + pkt->pts= pkt->pos*8 / (bps * s->streams[0]->codec->channels); + return ret; } @@ -127,9 +137,9 @@ static int raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt) if (av_new_packet(pkt, size) < 0) return AVERROR(EIO); - pkt->pos= url_ftell(&s->pb); + pkt->pos= url_ftell(s->pb); pkt->stream_index = 0; - ret = get_partial_buffer(&s->pb, pkt->data, size); + ret = get_partial_buffer(s->pb, pkt->data, size); if (ret <= 0) { av_free_packet(pkt); return AVERROR(EIO); @@ -143,19 +153,19 @@ static int ingenient_read_packet(AVFormatContext *s, AVPacket *pkt) { int ret, size, w, h, unk1, unk2; - if (get_le32(&s->pb) != MKTAG('M', 'J', 'P', 'G')) + if (get_le32(s->pb) != MKTAG('M', 'J', 'P', 'G')) return AVERROR(EIO); // FIXME - size = get_le32(&s->pb); + size = get_le32(s->pb); - w = get_le16(&s->pb); - h = get_le16(&s->pb); + w = get_le16(s->pb); + h = get_le16(s->pb); - url_fskip(&s->pb, 8); // zero + size (padded?) - url_fskip(&s->pb, 2); - unk1 = get_le16(&s->pb); - unk2 = get_le16(&s->pb); - url_fskip(&s->pb, 22); // ascii timestamp + url_fskip(s->pb, 8); // zero + size (padded?) + url_fskip(s->pb, 2); + unk1 = get_le16(s->pb); + unk2 = get_le16(s->pb); + url_fskip(s->pb, 22); // ascii timestamp av_log(NULL, AV_LOG_DEBUG, "Ingenient packet: size=%d, width=%d, height=%d, unk1=%d unk2=%d\n", size, w, h, unk1, unk2); @@ -163,9 +173,9 @@ static int ingenient_read_packet(AVFormatContext *s, AVPacket *pkt) if (av_new_packet(pkt, size) < 0) return AVERROR(EIO); - pkt->pos = url_ftell(&s->pb); + pkt->pos = url_ftell(s->pb); pkt->stream_index = 0; - ret = get_buffer(&s->pb, pkt->data, size); + ret = get_buffer(s->pb, pkt->data, size); if (ret <= 0) { av_free_packet(pkt); return AVERROR(EIO); @@ -205,7 +215,7 @@ int pcm_read_seek(AVFormatContext *s, /* recompute exact position */ st->cur_dts = av_rescale(pos, st->time_base.den, byte_rate * (int64_t)st->time_base.num); - url_fseek(&s->pb, pos + s->data_offset, SEEK_SET); + url_fseek(s->pb, pos + s->data_offset, SEEK_SET); return 0; } @@ -409,9 +419,6 @@ static int ac3_probe(AVProbeData *p) uint8_t *buf, *buf2, *end; AC3HeaderInfo hdr; - if(p->buf_size < 7) - return 0; - max_frames = 0; buf = p->buf; end = buf + p->buf_size; @@ -429,11 +436,17 @@ static int ac3_probe(AVProbeData *p) first_frames = frames; } if (first_frames>=3) return AVPROBE_SCORE_MAX * 3 / 4; - else if(max_frames>=2 || first_frames>=1) return AVPROBE_SCORE_MAX / 2; + else if(max_frames>=3) return AVPROBE_SCORE_MAX / 2; else if(max_frames>=1) return 1; else return 0; } +static int flac_probe(AVProbeData *p) +{ + if(memcmp(p->buf, "fLaC", 4)) return 0; + else return AVPROBE_SCORE_MAX / 2; +} + AVInputFormat shorten_demuxer = { "shn", "raw shorten", @@ -450,7 +463,7 @@ AVInputFormat flac_demuxer = { "flac", "raw flac", 0, - NULL, + flac_probe, flac_read_header, raw_read_partial_packet, raw_read_close, @@ -839,7 +852,9 @@ static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt) if (packet_size < 0) return -1; - ret= av_get_packet(&s->pb, pkt, packet_size); + ret= av_get_packet(s->pb, pkt, packet_size); + pkt->pts= + pkt->dts= pkt->pos / packet_size; pkt->stream_index = 0; if (ret != packet_size) {