~ubuntu-branches/ubuntu/utopic/ffmpeg-debian/utopic

« back to all changes in this revision

Viewing changes to libavformat/flvdec.c

  • Committer: Bazaar Package Importer
  • Author(s): Reinhard Tartler
  • Date: 2009-01-20 09:20:53 UTC
  • mfrom: (1.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20090120092053-izz63p40hc98qfgp
Tags: 3:0.svn20090119-1ubuntu1
* merge from debian. LP: #318501
* new version fixes CVE-2008-3230, LP: #253767

Show diffs side-by-side

added added

removed removed

Lines of Context:
26
26
#include "avformat.h"
27
27
#include "flv.h"
28
28
 
 
29
typedef struct {
 
30
    int wrong_dts; ///< wrong dts due to negative cts
 
31
} FLVContext;
 
32
 
29
33
static int flv_probe(AVProbeData *p)
30
34
{
31
35
    const uint8_t *d;
299
303
 
300
304
static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
301
305
{
 
306
    FLVContext *flv = s->priv_data;
302
307
    int ret, i, type, size, flags, is_audio;
303
308
    int64_t next, pos;
304
 
    unsigned dts;
 
309
    int64_t dts, pts = AV_NOPTS_VALUE;
305
310
    AVStream *st = NULL;
306
311
 
307
312
 retry:
386
391
    }
387
392
 
388
393
    if(is_audio){
389
 
        if(!st->codec->channels || !st->codec->sample_rate || !st->codec->bits_per_coded_sample || (!st->codec->codec_id && !st->codec->codec_tag)) {
 
394
        if(!st->codec->channels || !st->codec->sample_rate || !st->codec->bits_per_coded_sample) {
390
395
            st->codec->channels = (flags & FLV_AUDIO_CHANNEL_MASK) == FLV_STEREO ? 2 : 1;
391
396
            st->codec->sample_rate = (44100 << ((flags & FLV_AUDIO_SAMPLERATE_MASK) >> FLV_AUDIO_SAMPLERATE_OFFSET) >> 3);
392
397
            st->codec->bits_per_coded_sample = (flags & FLV_AUDIO_SAMPLESIZE_MASK) ? 16 : 8;
 
398
        }
 
399
        if(!st->codec->codec_id){
393
400
            flv_set_audio_codec(s, st, flags & FLV_AUDIO_CODECID_MASK);
394
401
        }
395
402
    }else{
401
408
        int type = get_byte(s->pb);
402
409
        size--;
403
410
        if (st->codec->codec_id == CODEC_ID_H264) {
404
 
            // cts offset ignored because it might to be signed
405
 
            // and would cause pts < dts
406
 
            get_be24(s->pb);
 
411
            int32_t cts = (get_be24(s->pb)+0xff800000)^0xff800000; // sign extension
 
412
            pts = dts + cts;
 
413
            if (cts < 0) { // dts are wrong
 
414
                flv->wrong_dts = 1;
 
415
                av_log(s, AV_LOG_WARNING, "negative cts, previous timestamps might be wrong\n");
 
416
            }
 
417
            if (flv->wrong_dts)
 
418
                dts = AV_NOPTS_VALUE;
407
419
        }
408
420
        if (type == 0) {
409
421
            if ((ret = flv_get_extradata(s, st, size)) < 0)
420
432
       packet */
421
433
    pkt->size = ret;
422
434
    pkt->dts = dts;
 
435
    pkt->pts = pts == AV_NOPTS_VALUE ? dts : pts;
423
436
    pkt->stream_index = st->index;
424
437
 
425
438
    if (is_audio || ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY))
431
444
AVInputFormat flv_demuxer = {
432
445
    "flv",
433
446
    NULL_IF_CONFIG_SMALL("FLV format"),
434
 
    0,
 
447
    sizeof(FLVContext),
435
448
    flv_probe,
436
449
    flv_read_header,
437
450
    flv_read_packet,