Ticket #5755: t5755_h264_aspect.diff

File t5755_h264_aspect.diff, 6.9 KB (added by Janne Grunau, 11 years ago)

records the aspect ratio of H264 recordings

  • libs/libmythtv/recorderbase.cpp

    void RecorderBase::AspectChange(AspectRatio aspect 
    294294        case ASPECT_21_1_1 :
    295295            mark = MARK_ASPECT_21_1_1;
    296296            break;
     297        case ASPECT_OTHER :
     298            mark = MARK_ASPECT_OTHER;
     299            break;
    297300        default :
    298301            mark = MARK_ASPECT_4_3;
    299302    }
  • libs/libmythtv/dtvrecorder.cpp

    bool DTVRecorder::FindH264Keyframes(const TSPacket 
    483483        _start_code = 0xffffffff;
    484484    }
    485485
     486    uint aspectRatio = 0;
    486487    uint height = 0;
    487488    uint width = 0;
    488489
    bool DTVRecorder::FindH264Keyframes(const TSPacket 
    567568                hasKeyFrame = m_h264_parser.onKeyFrameStart();
    568569                hasFrame = true;
    569570                _seen_sps |= hasKeyFrame;
     571           
     572                width = m_h264_parser.pictureWidth();
     573                height = m_h264_parser.pictureHeight();
     574                aspectRatio = m_h264_parser.aspectRatio();
    570575            }
    571             width = m_h264_parser.pictureWidth();
    572             height = m_h264_parser.pictureHeight();
    573576        }
    574577    } // for (; i < TSPacket::SIZE; i++)
    575578
    bool DTVRecorder::FindH264Keyframes(const TSPacket 
    586589            _frames_written_count++;
    587590    }
    588591
     592    if ((aspectRatio > 0) && (aspectRatio != m_videoAspect))
     593    {
     594        m_videoAspect = aspectRatio;
     595        AspectChange((AspectRatio)aspectRatio, _frames_written_count);
     596    }
     597
    589598    if (height && width && (height != m_videoHeight || m_videoWidth != width))
    590599    {
    591600        m_videoHeight = height;
  • libs/libmythtv/recorderbase.h

    class MPUBLIC RecorderBase 
    217217        ASPECT_1_1           = 0x01,
    218218        ASPECT_4_3           = 0x02,
    219219        ASPECT_16_9          = 0x03,
    220         ASPECT_21_1_1         = 0x04
     220        ASPECT_21_1_1        = 0x04,
     221        ASPECT_OTHER         = 0x05,
    221222    };
    222223
    223224  protected:
  • libs/libmythtv/mpeg/H264Parser.h

    class H264Parser { 
    108108    uint pictureWidth(void) const { return pic_width; }
    109109    uint pictureHeight(void) const { return pic_height; }
    110110
     111    /** \brief Computes aspect ratio from picture size and sample aspect ratio
     112     */
     113    uint aspectRatio(void) const;
     114
    111115    uint64_t frameAUstreamOffset(void) const {return frame_start_offset;}
    112116    uint64_t keyframeAUstreamOffset(void) const {return keyframe_start_offset;}
    113117
    class H264Parser { 
    177181    uint       frame_crop_right_offset;
    178182    uint       frame_crop_top_offset;
    179183    uint       frame_crop_bottom_offset;
     184    uint8_t    aspect_ratio_idc;
    180185    uint       sar_width, sar_height;
    181186
    182187    uint64_t   AU_offset, frame_start_offset, keyframe_start_offset;
  • libs/libmythtv/mpeg/H264Parser.cpp

    extern "C" { 
    77#include "avcodec.h"
    88}
    99
    10 // #include <math.h>
     10#include <cmath>
    1111
     12static const float eps = 1E-5;
     13
    1214/*
    1315  Most of the comments below were cut&paste from ITU-T Rec. H.264
    1416  as found here:  http://www.itu.int/rec/T-REC-H.264/e
    void H264Parser::Reset(void) 
    129131    pic_width = pic_height = 0;
    130132    frame_crop_left_offset = frame_crop_right_offset = 0;
    131133    frame_crop_top_offset = frame_crop_bottom_offset = 0;
     134    aspect_ratio_idc = 0;
    132135    sar_width = sar_height = 0;
    133136
    134137    AU_offset = frame_start_offset = keyframe_start_offset = 0;
    void H264Parser::vui_parameters(GetBitContext * gb 
    819822          present, aspect_ratio_idc value shall be inferred to be
    820823          equal to 0.
    821824         */
    822         uint8_t aspect_ratio_idc = get_bits(gb, 8);
     825        aspect_ratio_idc = get_bits(gb, 8);
    823826
    824827        switch (aspect_ratio_idc)
    825828        {
    void H264Parser::vui_parameters(GetBitContext * gb 
    921924    else
    922925        sar_width = sar_height = 0;
    923926}
     927
     928uint H264Parser::aspectRatio(void) const
     929{
     930
     931    double aspect = 0.0;
     932
     933    if (pic_height)
     934        aspect = pic_width / (double)pic_height;
     935
     936    switch (aspect_ratio_idc)
     937    {
     938        case 0:
     939            // Unspecified
     940            break;
     941        case 1:
     942            // 1:1
     943            break;
     944        case 2:
     945            // 12:11
     946            aspect *= 1.0909090909090908;
     947            break;
     948        case 3:
     949            // 10:11
     950            aspect *= 0.90909090909090906;
     951            break;
     952        case 4:
     953            // 16:11
     954            aspect *= 1.4545454545454546;
     955            break;
     956        case 5:
     957            // 40:33
     958            aspect *= 1.2121212121212122;
     959            break;
     960        case 6:
     961            // 24:11
     962            aspect *= 2.1818181818181817;
     963            break;
     964        case 7:
     965            // 20:11
     966            aspect *= 1.8181818181818181;
     967            break;
     968        case 8:
     969            // 32:11
     970            aspect *= 2.9090909090909092;
     971            break;
     972        case 9:
     973            // 80:33
     974            aspect *= 2.4242424242424243;
     975            break;
     976        case 10:
     977            // 18:11
     978            aspect *= 1.6363636363636365;
     979            break;
     980        case 11:
     981            // 15:11
     982            aspect *= 1.3636363636363635;
     983            break;
     984        case 12:
     985            // 64:33
     986            aspect *= 1.9393939393939394;
     987            break;
     988        case 13:
     989            // 160:99
     990            aspect *= 1.6161616161616161;
     991            break;
     992        case EXTENDED_SAR:
     993            if (sar_height)
     994                aspect *= sar_width / (double)sar_height;
     995            else
     996                aspect = 0.0;
     997            break;
     998    }
     999
     1000    if (aspect == 0.0)
     1001        return 0;
     1002    if (fabs(aspect - 1.3333333333333333) < eps)
     1003        return 2;
     1004    if (fabs(aspect - 1.7777777777777777) < eps)
     1005        return 3;
     1006    if (fabs(aspect - 2.21) < eps)
     1007        return 4;
     1008   
     1009    return 5;
     1010}
  • libs/libmythtv/programinfo.h

    typedef enum { 
    4646    MARK_ASPECT_4_3    = 11,
    4747    MARK_ASPECT_16_9   = 12,
    4848    MARK_ASPECT_21_1_1 = 13,
     49    MARK_ASPECT_OTHER  = 14,
    4950    MARK_VIDEO_WIDTH   = 30,
    5051    MARK_VIDEO_HEIGHT  = 31,
    5152} MarkTypes;