mpegvideo.c
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:18k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * mpegvideo.c: parse and packetize an MPEG1/2 video stream
  3.  *****************************************************************************
  4.  * Copyright (C) 2001, 2002 VideoLAN
  5.  * $Id: mpegvideo.c 8812 2004-09-26 19:59:49Z gbazin $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *          Eric Petit <titer@videolan.org>
  9.  *          Gildas Bazin <gbazin@videolan.org>
  10.  *
  11.  * This program is free software; you can redistribute it and/or modify
  12.  * it under the terms of the GNU General Public License as published by
  13.  * the Free Software Foundation; either version 2 of the License, or
  14.  * (at your option) any later version.
  15.  *
  16.  * This program is distributed in the hope that it will be useful,
  17.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  * GNU General Public License for more details.
  20.  *
  21.  * You should have received a copy of the GNU General Public License
  22.  * along with this program; if not, write to the Free Software
  23.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  24.  *****************************************************************************/
  25. /*****************************************************************************
  26.  * Problem with this implementation:
  27.  *
  28.  * Although we should time-stamp each picture with a PTS, this isn't possible
  29.  * with the current implementation.
  30.  * The problem comes from the fact that for non-low-delay streams we can't
  31.  * calculate the PTS of pictures used as backward reference. Even the temporal
  32.  * reference number doesn't help here because all the pictures don't
  33.  * necessarily have the same duration (eg. 3:2 pulldown).
  34.  *
  35.  * However this doesn't really matter as far as the MPEG muxers are concerned
  36.  * because they allow having empty PTS fields. --gibalou
  37.  *****************************************************************************/
  38. /*****************************************************************************
  39.  * Preamble
  40.  *****************************************************************************/
  41. #include <stdlib.h>                                      /* malloc(), free() */
  42. #include <vlc/vlc.h>
  43. #include <vlc/decoder.h>
  44. #include <vlc/input.h>
  45. #include "vlc_block_helper.h"
  46. /*****************************************************************************
  47.  * Module descriptor
  48.  *****************************************************************************/
  49. static int  Open ( vlc_object_t * );
  50. static void Close( vlc_object_t * );
  51. vlc_module_begin();
  52.     set_description( _("MPEG-I/II video packetizer") );
  53.     set_capability( "packetizer", 50 );
  54.     set_callbacks( Open, Close );
  55. vlc_module_end();
  56. /*****************************************************************************
  57.  * Local prototypes
  58.  *****************************************************************************/
  59. static block_t *Packetize( decoder_t *, block_t ** );
  60. static block_t *ParseMPEGBlock( decoder_t *, block_t * );
  61. struct decoder_sys_t
  62. {
  63.     /*
  64.      * Input properties
  65.      */
  66.     block_bytestream_t bytestream;
  67.     int i_state;
  68.     int i_offset;
  69.     uint8_t p_startcode[3];
  70.     /* Sequence header and extension */
  71.     block_t *p_seq;
  72.     block_t *p_ext;
  73.     /* Current frame being built */
  74.     block_t    *p_frame;
  75.     block_t    **pp_last;
  76.     vlc_bool_t b_frame_slice;
  77.     mtime_t i_pts;
  78.     mtime_t i_dts;
  79.     /* Sequence properties */
  80.     int         i_frame_rate;
  81.     int         i_frame_rate_base;
  82.     vlc_bool_t  b_seq_progressive;
  83.     vlc_bool_t  b_low_delay;
  84.     int         i_aspect_ratio_info;
  85.     vlc_bool_t  b_inited;
  86.     /* Picture properties */
  87.     int i_temporal_ref;
  88.     int i_picture_type;
  89.     int i_picture_structure;
  90.     int i_top_field_first;
  91.     int i_repeat_first_field;
  92.     int i_progressive_frame;
  93.     mtime_t i_interpolated_dts;
  94.     mtime_t i_old_duration;
  95.     mtime_t i_last_ref_pts;
  96.     /* Number of pictures since last sequence header */
  97.     int i_seq_old;
  98. };
  99. enum {
  100.     STATE_NOSYNC,
  101.     STATE_NEXT_SYNC
  102. };
  103. /*****************************************************************************
  104.  * Open:
  105.  *****************************************************************************/
  106. static int Open( vlc_object_t *p_this )
  107. {
  108.     decoder_t *p_dec = (decoder_t*)p_this;
  109.     decoder_sys_t *p_sys;
  110.     if( p_dec->fmt_in.i_codec != VLC_FOURCC( 'm', 'p', 'g', '1' ) &&
  111.         p_dec->fmt_in.i_codec != VLC_FOURCC( 'm', 'p', 'g', '2' ) &&
  112.         p_dec->fmt_in.i_codec != VLC_FOURCC( 'm', 'p', 'g', 'v' ) )
  113.     {
  114.         return VLC_EGENERIC;
  115.     }
  116.     es_format_Init( &p_dec->fmt_out, VIDEO_ES, VLC_FOURCC('m','p','g','v') );
  117.     p_dec->pf_packetize = Packetize;
  118.     p_dec->p_sys = p_sys = malloc( sizeof( decoder_sys_t ) );
  119.     /* Misc init */
  120.     p_sys->i_state = STATE_NOSYNC;
  121.     p_sys->bytestream = block_BytestreamInit( p_dec );
  122.     p_sys->p_startcode[0] = 0;
  123.     p_sys->p_startcode[1] = 0;
  124.     p_sys->p_startcode[2] = 1;
  125.     p_sys->i_offset = 0;
  126.     p_sys->p_seq = NULL;
  127.     p_sys->p_ext = NULL;
  128.     p_sys->p_frame = NULL;
  129.     p_sys->pp_last = &p_sys->p_frame;
  130.     p_sys->b_frame_slice = VLC_FALSE;
  131.     p_sys->i_dts = p_sys->i_pts = 0;
  132.     p_sys->i_frame_rate = 1;
  133.     p_sys->i_frame_rate_base = 1;
  134.     p_sys->b_seq_progressive = VLC_TRUE;
  135.     p_sys->b_low_delay = VLC_TRUE;
  136.     p_sys->i_seq_old = 0;
  137.     p_sys->i_temporal_ref = 0;
  138.     p_sys->i_picture_type = 0;
  139.     p_sys->i_picture_structure = 0x03; /* frame */
  140.     p_sys->i_top_field_first = 0;
  141.     p_sys->i_repeat_first_field = 0;
  142.     p_sys->i_progressive_frame = 0;
  143.     p_sys->b_inited = 0;
  144.     p_sys->i_interpolated_dts = 0;
  145.     p_sys->i_old_duration = 0;
  146.     p_sys->i_last_ref_pts = 0;
  147.     return VLC_SUCCESS;
  148. }
  149. /*****************************************************************************
  150.  * Close:
  151.  *****************************************************************************/
  152. static void Close( vlc_object_t *p_this )
  153. {
  154.     decoder_t     *p_dec = (decoder_t*)p_this;
  155.     decoder_sys_t *p_sys = p_dec->p_sys;
  156.     block_BytestreamRelease( &p_sys->bytestream );
  157.     if( p_sys->p_seq )
  158.     {
  159.         block_Release( p_sys->p_seq );
  160.     }
  161.     if( p_sys->p_ext )
  162.     {
  163.         block_Release( p_sys->p_ext );
  164.     }
  165.     if( p_sys->p_frame )
  166.     {
  167.         block_ChainRelease( p_sys->p_frame );
  168.     }
  169.     free( p_sys );
  170. }
  171. /*****************************************************************************
  172.  * Packetize:
  173.  *****************************************************************************/
  174. static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
  175. {
  176.     decoder_sys_t *p_sys = p_dec->p_sys;
  177.     block_t       *p_pic;
  178.     if( pp_block == NULL || *pp_block == NULL )
  179.     {
  180.         return NULL;
  181.     }
  182.     if( (*pp_block)->i_flags & BLOCK_FLAG_DISCONTINUITY )
  183.     {
  184.         p_sys->i_state = STATE_NOSYNC;
  185.         if( p_sys->p_frame ) block_ChainRelease( p_sys->p_frame );
  186.         p_sys->p_frame = NULL;
  187.         p_sys->pp_last = &p_sys->p_frame;
  188.         p_sys->b_frame_slice = VLC_FALSE;
  189.         block_Release( *pp_block );
  190.         return NULL;
  191.     }
  192.     block_BytestreamPush( &p_sys->bytestream, *pp_block );
  193.     while( 1 )
  194.     {
  195.         switch( p_sys->i_state )
  196.         {
  197.         case STATE_NOSYNC:
  198.             if( block_FindStartcodeFromOffset( &p_sys->bytestream,
  199.                     &p_sys->i_offset, p_sys->p_startcode, 3 ) == VLC_SUCCESS )
  200.             {
  201.                 p_sys->i_state = STATE_NEXT_SYNC;
  202.             }
  203.             if( p_sys->i_offset )
  204.             {
  205.                 block_SkipBytes( &p_sys->bytestream, p_sys->i_offset );
  206.                 p_sys->i_offset = 0;
  207.                 block_BytestreamFlush( &p_sys->bytestream );
  208.             }
  209.             if( p_sys->i_state != STATE_NEXT_SYNC )
  210.             {
  211.                 /* Need more data */
  212.                 return NULL;
  213.             }
  214.             p_sys->i_offset = 1; /* To find next startcode */
  215.         case STATE_NEXT_SYNC:
  216.             /* TODO: If p_block == NULL, flush the buffer without checking the
  217.              * next sync word */
  218.             /* Find the next startcode */
  219.             if( block_FindStartcodeFromOffset( &p_sys->bytestream,
  220.                     &p_sys->i_offset, p_sys->p_startcode, 3 ) != VLC_SUCCESS )
  221.             {
  222.                 /* Need more data */
  223.                 return NULL;
  224.             }
  225.             /* Get the new fragment and set the pts/dts */
  226.             p_pic = block_New( p_dec, p_sys->i_offset );
  227.             block_BytestreamFlush( &p_sys->bytestream );
  228.             p_pic->i_pts = p_sys->bytestream.p_block->i_pts;
  229.             p_pic->i_dts = p_sys->bytestream.p_block->i_dts;
  230.             block_GetBytes( &p_sys->bytestream, p_pic->p_buffer,
  231.                             p_pic->i_buffer );
  232.             /* don't reuse the same timestamps several times */
  233.             if( p_pic->i_buffer >= 4 && p_pic->p_buffer[3] == 0x00 )
  234.             {
  235.                 /* We have a picture start code */
  236.                 p_sys->bytestream.p_block->i_pts = 0;
  237.                 p_sys->bytestream.p_block->i_dts = 0;
  238.             }
  239.             p_sys->i_offset = 0;
  240.             /* Get picture if any */
  241.             if( !( p_pic = ParseMPEGBlock( p_dec, p_pic ) ) )
  242.             {
  243.                 p_sys->i_state = STATE_NOSYNC;
  244.                 break;
  245.             }
  246.             /* We've just started the stream, wait for the first PTS.
  247.              * We discard here so we can still get the sequence header. */
  248.             if( p_sys->i_dts <= 0 && p_sys->i_pts <= 0 &&
  249.                 p_sys->i_interpolated_dts <= 0 )
  250.             {
  251.                 msg_Dbg( p_dec, "need a starting pts/dts" );
  252.                 p_sys->i_state = STATE_NOSYNC;
  253.                 block_Release( p_pic );
  254.                 break;
  255.             }
  256.             /* When starting the stream we can have the first frame with
  257.              * a null DTS (i_interpolated_pts is initialized to 0) */
  258.             if( !p_pic->i_dts ) p_pic->i_dts = p_pic->i_pts;
  259.             /* So p_block doesn't get re-added several times */
  260.             *pp_block = block_BytestreamPop( &p_sys->bytestream );
  261.             p_sys->i_state = STATE_NOSYNC;
  262.             return p_pic;
  263.         }
  264.     }
  265. }
  266. /*****************************************************************************
  267.  * ParseMPEGBlock: Re-assemble fragments into a block containing a picture
  268.  *****************************************************************************/
  269. static block_t *ParseMPEGBlock( decoder_t *p_dec, block_t *p_frag )
  270. {
  271.     decoder_sys_t *p_sys = p_dec->p_sys;
  272.     block_t *p_pic = NULL;
  273.     /*
  274.      * Check if previous picture is finished
  275.      */
  276.     if( ( p_sys->b_frame_slice &&
  277.           (p_frag->p_buffer[3] == 0x00 || p_frag->p_buffer[3] > 0xaf) ) &&
  278.           p_sys->p_seq == NULL )
  279.     {
  280.         /* We have a picture but without a sequence header we can't
  281.          * do anything */
  282.         msg_Dbg( p_dec, "waiting for sequence start" );
  283.         if( p_sys->p_frame ) block_ChainRelease( p_sys->p_frame );
  284.         p_sys->p_frame = NULL;
  285.         p_sys->pp_last = &p_sys->p_frame;
  286.         p_sys->b_frame_slice = VLC_FALSE;
  287.     }
  288.     else if( p_sys->b_frame_slice &&
  289.              (p_frag->p_buffer[3] == 0x00 || p_frag->p_buffer[3] > 0xaf) )
  290.     {
  291.         mtime_t i_duration;
  292.         p_pic = block_ChainGather( p_sys->p_frame );
  293.         i_duration = (mtime_t)( 1000000 * p_sys->i_frame_rate_base /
  294.                                 p_sys->i_frame_rate );
  295.         if( !p_sys->b_seq_progressive && p_sys->i_picture_structure != 0x03 )
  296.         {
  297.             i_duration /= 2;
  298.         }
  299.         if( p_sys->b_seq_progressive )
  300.         {
  301.             if( p_sys->i_top_field_first == 0 &&
  302.                 p_sys->i_repeat_first_field == 1 )
  303.             {
  304.                 i_duration *= 2;
  305.             }
  306.             else if( p_sys->i_top_field_first == 1 &&
  307.                      p_sys->i_repeat_first_field == 1 )
  308.             {
  309.                 i_duration *= 3;
  310.             }
  311.         }
  312.         else
  313.         {
  314.             if( p_sys->i_picture_structure == 0x03 )
  315.             {
  316.                 if( p_sys->i_progressive_frame && p_sys->i_repeat_first_field )
  317.                 {
  318.                     i_duration += i_duration / 2;
  319.                 }
  320.             }
  321.         }
  322.         if( p_sys->b_low_delay || p_sys->i_picture_type == 0x03 )
  323.         {
  324.             /* Trivial case (DTS == PTS) */
  325.             /* Correct interpolated dts when we receive a new pts/dts */
  326.             if( p_sys->i_pts > 0 ) p_sys->i_interpolated_dts = p_sys->i_pts;
  327.             if( p_sys->i_dts > 0 ) p_sys->i_interpolated_dts = p_sys->i_dts;
  328.         }
  329.         else
  330.         {
  331.             /* Correct interpolated dts when we receive a new pts/dts */
  332.             if( p_sys->i_last_ref_pts > 0 )
  333.                 p_sys->i_interpolated_dts = p_sys->i_last_ref_pts;
  334.             if( p_sys->i_dts > 0 ) p_sys->i_interpolated_dts = p_sys->i_dts;
  335.             p_sys->i_last_ref_pts = p_sys->i_pts;
  336.         }
  337.         p_pic->i_dts = p_sys->i_interpolated_dts;
  338.         /* Set PTS only if we have a B frame or if it comes from the stream */
  339.         if( p_sys->i_pts > 0 )
  340.         {
  341.             p_pic->i_pts = p_sys->i_pts;
  342.         }
  343.         else if( p_sys->i_picture_type == 0x03 )
  344.         {
  345.             p_pic->i_pts = p_pic->i_dts;
  346.         }
  347.         else
  348.         {
  349.             p_pic->i_pts = 0;
  350.         }
  351.         if( p_sys->b_low_delay || p_sys->i_picture_type == 0x03 )
  352.         {
  353.             /* Trivial case (DTS == PTS) */
  354.             p_sys->i_interpolated_dts += i_duration;
  355.         }
  356.         else
  357.         {
  358.             p_sys->i_interpolated_dts += p_sys->i_old_duration;
  359.             p_sys->i_old_duration = i_duration;
  360.         }
  361.         switch ( p_sys->i_picture_type )
  362.         {
  363.         case 0x01:
  364.             p_pic->i_flags |= BLOCK_FLAG_TYPE_I;
  365.             break;
  366.         case 0x02:
  367.             p_pic->i_flags |= BLOCK_FLAG_TYPE_P;
  368.             break;
  369.         case 0x03:
  370.             p_pic->i_flags |= BLOCK_FLAG_TYPE_B;
  371.             break;
  372.         }
  373.         p_pic->i_length = p_sys->i_interpolated_dts - p_pic->i_dts;
  374. #if 0
  375.         msg_Dbg( p_dec, "pic: type=%d dts="I64Fd" pts-dts="I64Fd,
  376.         p_sys->i_picture_type, p_pic->i_dts, p_pic->i_pts - p_pic->i_dts);
  377. #endif
  378.         /* Reset context */
  379.         p_sys->p_frame = NULL;
  380.         p_sys->pp_last = &p_sys->p_frame;
  381.         p_sys->b_frame_slice = VLC_FALSE;
  382.     }
  383.     /*
  384.      * Check info of current fragment
  385.      */
  386.     if( p_frag->p_buffer[3] == 0xb8 )
  387.     {
  388.         /* Group start code */
  389.         if( p_sys->p_seq &&
  390.             p_sys->i_seq_old > p_sys->i_frame_rate/p_sys->i_frame_rate_base )
  391.         {
  392.             /* Usefull for mpeg1: repeat sequence header every second */
  393.             block_ChainLastAppend( &p_sys->pp_last, block_Duplicate( p_sys->p_seq ) );
  394.             if( p_sys->p_ext )
  395.             {
  396.                 block_ChainLastAppend( &p_sys->pp_last, block_Duplicate( p_sys->p_ext ) );
  397.             }
  398.             p_sys->i_seq_old = 0;
  399.         }
  400.     }
  401.     else if( p_frag->p_buffer[3] == 0xb3 && p_frag->i_buffer >= 8 )
  402.     {
  403.         /* Sequence header code */
  404.         static const int code_to_frame_rate[16][2] =
  405.         {
  406.             { 1, 1 },  /* invalid */
  407.             { 24000, 1001 }, { 24, 1 }, { 25, 1 },       { 30000, 1001 },
  408.             { 30, 1 },       { 50, 1 }, { 60000, 1001 }, { 60, 1 },
  409.             /* Unofficial 15fps from Xing*/
  410.             { 15, 1001 },
  411.             /* Unofficial economy rates from libmpeg3 */
  412.             { 5, 1001 }, { 10, 1001 }, { 12, 1001 }, { 15, 1001 },
  413.             { 1, 1 },  { 1, 1 }  /* invalid */
  414.         };
  415.         if( p_sys->p_seq ) block_Release( p_sys->p_seq );
  416.         if( p_sys->p_ext ) block_Release( p_sys->p_ext );
  417.         p_sys->p_seq = block_Duplicate( p_frag );
  418.         p_sys->i_seq_old = 0;
  419.         p_sys->p_ext = NULL;
  420.         p_dec->fmt_out.video.i_width =
  421.             ( p_frag->p_buffer[4] << 4)|(p_frag->p_buffer[5] >> 4 );
  422.         p_dec->fmt_out.video.i_height =
  423.             ( (p_frag->p_buffer[5]&0x0f) << 8 )|p_frag->p_buffer[6];
  424.         p_sys->i_aspect_ratio_info = p_frag->p_buffer[7] >> 4;
  425.         /* TODO: MPEG1 aspect ratio */
  426.         p_sys->i_frame_rate = code_to_frame_rate[p_frag->p_buffer[7]&0x0f][0];
  427.         p_sys->i_frame_rate_base =
  428.             code_to_frame_rate[p_frag->p_buffer[7]&0x0f][1];
  429.         p_dec->fmt_out.video.i_frame_rate = p_sys->i_frame_rate;
  430.         p_dec->fmt_out.video.i_frame_rate_base = p_sys->i_frame_rate_base;
  431.         p_sys->b_seq_progressive = VLC_TRUE;
  432.         p_sys->b_low_delay = VLC_TRUE;
  433.         if ( !p_sys->b_inited )
  434.         {
  435.             msg_Dbg( p_dec, "Size %dx%d fps=%.3f",
  436.                  p_dec->fmt_out.video.i_width, p_dec->fmt_out.video.i_height,
  437.                  p_sys->i_frame_rate / (float)p_sys->i_frame_rate_base );
  438.             p_sys->b_inited = 1;
  439.         }
  440.     }
  441.     else if( p_frag->p_buffer[3] == 0xb5 )
  442.     {
  443.         int i_type = p_frag->p_buffer[4] >> 4;
  444.         /* Extention start code */
  445.         if( i_type == 0x01 )
  446.         {
  447.             static const int mpeg2_aspect[16][2] =
  448.             {
  449.                 {0,1}, {1,1}, {4,3}, {16,9}, {221,100},
  450.                 {0,1}, {0,1}, {0,1}, {0,1}, {0,1}, {0,1}, {0,1}, {0,1}, {0,1},
  451.                 {0,1}, {0,1}
  452.             };
  453.             /* sequence extention */
  454.             if( p_sys->p_ext) block_Release( p_sys->p_ext );
  455.             p_sys->p_ext = block_Duplicate( p_frag );
  456.             if( p_frag->i_buffer >= 10 )
  457.             {
  458.                 p_sys->b_seq_progressive =
  459.                     p_frag->p_buffer[5]&0x08 ? VLC_TRUE : VLC_FALSE;
  460.                 p_sys->b_low_delay =
  461.                     p_frag->p_buffer[9]&0x80 ? VLC_TRUE : VLC_FALSE;
  462.             }
  463.             p_dec->fmt_out.video.i_aspect =
  464.                 mpeg2_aspect[p_sys->i_aspect_ratio_info][0] *
  465.                 VOUT_ASPECT_FACTOR /
  466.                 mpeg2_aspect[p_sys->i_aspect_ratio_info][1];
  467.         }
  468.         else if( i_type == 0x08 )
  469.         {
  470.             /* picture extention */
  471.             p_sys->i_picture_structure = p_frag->p_buffer[6]&0x03;
  472.             p_sys->i_top_field_first   = p_frag->p_buffer[7] >> 7;
  473.             p_sys->i_repeat_first_field= (p_frag->p_buffer[7]>>1)&0x01;
  474.             p_sys->i_progressive_frame = p_frag->p_buffer[8] >> 7;
  475.         }
  476.     }
  477.     else if( p_frag->p_buffer[3] == 0x00 )
  478.     {
  479.         /* Picture start code */
  480.         p_sys->i_seq_old++;
  481.         if( p_frag->i_buffer >= 6 )
  482.         {
  483.             p_sys->i_temporal_ref =
  484.                 ( p_frag->p_buffer[4] << 2 )|(p_frag->p_buffer[5] >> 6);
  485.             p_sys->i_picture_type = ( p_frag->p_buffer[5] >> 3 ) & 0x03;
  486.         }
  487.         p_sys->i_dts = p_frag->i_dts;
  488.         p_sys->i_pts = p_frag->i_pts;
  489.     }
  490.     else if( p_frag->p_buffer[3] >= 0x01 && p_frag->p_buffer[3] <= 0xaf )
  491.     {
  492.         /* Slice start code */
  493.         p_sys->b_frame_slice = VLC_TRUE;
  494.     }
  495.     /* Append the block */
  496.     block_ChainLastAppend( &p_sys->pp_last, p_frag );
  497.     return p_pic;
  498. }