Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * RAW MPEG video demuxer
  3.  * Copyright (c) 2002-2003 Fabrice Bellard
  4.  * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
  5.  *
  6.  * This file is part of FFmpeg.
  7.  *
  8.  * FFmpeg is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU Lesser General Public
  10.  * License as published by the Free Software Foundation; either
  11.  * version 2.1 of the License, or (at your option) any later version.
  12.  *
  13.  * FFmpeg is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16.  * Lesser General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU Lesser General Public
  19.  * License along with FFmpeg; if not, write to the Free Software
  20.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  21.  */
  22.  
  23. #include "avformat.h"
  24. #include "rawdec.h"
  25.  
  26. #define SEQ_START_CODE          0x000001b3
  27. #define GOP_START_CODE          0x000001b8
  28. #define PICTURE_START_CODE      0x00000100
  29. #define SLICE_START_CODE        0x00000101
  30. #define PACK_START_CODE         0x000001ba
  31. #define VIDEO_ID                0x000001e0
  32. #define AUDIO_ID                0x000001c0
  33.  
  34. static int mpegvideo_probe(AVProbeData *p)
  35. {
  36.     uint32_t code= -1;
  37.     int pic=0, seq=0, slice=0, pspack=0, vpes=0, apes=0, res=0, sicle=0;
  38.     int i;
  39.     uint32_t last = 0;
  40.  
  41.     for(i=0; i<p->buf_size; i++){
  42.         code = (code<<8) + p->buf[i];
  43.         if ((code & 0xffffff00) == 0x100) {
  44.             switch(code){
  45.             case     SEQ_START_CODE:   seq++; break;
  46.             case PICTURE_START_CODE:   pic++; break;
  47.             case    PACK_START_CODE: pspack++; break;
  48.             case              0x1b6:
  49.                                         res++; break;
  50.             }
  51.             if (code >= SLICE_START_CODE && code <= 0x1af) {
  52.                 if (last >= SLICE_START_CODE && last <= 0x1af) {
  53.                     if (code >= last) slice++;
  54.                     else              sicle++;
  55.                 }else{
  56.                     if (code == SLICE_START_CODE) slice++;
  57.                     else                          sicle++;
  58.                 }
  59.             }
  60.             if     ((code & 0x1f0) == VIDEO_ID)   vpes++;
  61.             else if((code & 0x1e0) == AUDIO_ID)   apes++;
  62.             last = code;
  63.         }
  64.     }
  65.     if(seq && seq*9<=pic*10 && pic*9<=slice*10 && !pspack && !apes && !res && slice > sicle) {
  66.         if(vpes) return AVPROBE_SCORE_EXTENSION / 4;
  67.         else     return pic>1 ? AVPROBE_SCORE_EXTENSION + 1 : AVPROBE_SCORE_EXTENSION / 2; // +1 for .mpg
  68.     }
  69.     return 0;
  70. }
  71.  
  72. FF_DEF_RAWVIDEO_DEMUXER(mpegvideo, "raw MPEG video", mpegvideo_probe, NULL, AV_CODEC_ID_MPEG1VIDEO)
  73.