ff_stream_info_impl::ff_stream_info_impl(const AVStream * _AVStream)
{
    DT_ASSERT(NULL != _AVStream);
    if (NULL == _AVStream)
        BOOST_THROW_EXCEPTION(errors::invalid_pointer());

    m_index = _AVStream->index;
    m_id = _AVStream->id;
    m_frame_rate = FF2DTType(_AVStream->r_frame_rate);
    m_first_dts = _AVStream->first_dts;
    m_time_base = FF2DTType(_AVStream->time_base);
    m_start_time = _AVStream->start_time;
    m_duration = _AVStream->duration;
    m_language = /*_AVStream->language*/""; // remove from ffmpeg 0.8
    m_frames_count = _AVStream->nb_frames;
    m_sample_aspect_ratio = FF2DTType(_AVStream->sample_aspect_ratio);
    m_metadata = metadata_ptr(/*new ff_metadata(_AVStream->metadata)*/);
    m_avg_frame_rate = FF2DTType(_AVStream->avg_frame_rate);
    m_decoder_info = create_ff_decoder_info(_AVStream->codec);
}
ff_stream_info_impl::ff_stream_info_impl(const AVFormatContext * avFormatContext, const AVStream * _AVStream)
{
    DT_ASSERT(NULL != _AVStream);
    if (NULL == _AVStream)
        BOOST_THROW_EXCEPTION(errors::invalid_pointer());

    m_index = _AVStream->index;
    m_id = _AVStream->id;
    m_frame_rate = FF2DTType(_AVStream->r_frame_rate);
    m_first_dts = _AVStream->first_dts;
    m_time_base = FF2DTType(_AVStream->time_base);
    m_start_time = _AVStream->start_time;

    const AVRational tb = {1, AV_TIME_BASE};
    m_duration = (_AVStream->duration != AV_NOPTS_VALUE) ? _AVStream->duration : convertDuration(avFormatContext->duration,  tb, _AVStream->time_base);;

    m_language = /*_AVStream->language*/""; // remove from ffmpeg 0.8
    m_frames_count = _AVStream->nb_frames;
    m_sample_aspect_ratio = FF2DTType(_AVStream->sample_aspect_ratio);
    m_metadata = metadata_ptr(/*new ff_metadata(_AVStream->metadata)*/);
    m_avg_frame_rate = FF2DTType(_AVStream->avg_frame_rate);
    m_decoder_info = create_ff_decoder_info(_AVStream->codec);
}
 virtual dt_rational_t get_time_base() const
 {
     return FF2DTType(m_CodecContext.time_base);
 }
 virtual dt_codec_id_t   get_codec_id() const
 {
     return FF2DTType(m_CodecContext.codec_id);
 }
 virtual dt_media_type_t get_codec_type() const
 {
     return FF2DTType(m_CodecContext.codec_type);
 }
 virtual dt_sample_format_t get_sample_format() const
 {
     return FF2DTType(m_CodecContext.sample_fmt);
 }
 virtual dt_rational_t get_sample_aspect_ratio() const
 {
     return FF2DTType(m_CodecContext.sample_aspect_ratio);
 }
 virtual dt_pixel_format_t get_pix_fmt() const
 {
     return FF2DTType(m_CodecContext.pix_fmt);
 }
video_data_ptr swscale_picture_convert_impl::convert(video_data_ptr _InputData)
{
    if (!swsContext_)
    {
        BOOST_THROW_EXCEPTION( errors::unexpected() );
        return video_data_ptr();
    }

    uint8_t * data[4] = {
        _InputData->get_plane(0),
        _InputData->get_plane(1),
        _InputData->get_plane(2),
        _InputData->get_plane(3)
    };

    int linesize[4] = {
        _InputData->get_line_size(0),
        _InputData->get_line_size(1),
        _InputData->get_line_size(2),
        _InputData->get_line_size(3)
    };

    sws_scale(swsContext_.get(), data, linesize, 0, inputHeight_, outputFrame_.get()->data, outputFrame_.get()->linesize); 

    return video_data_ptr(new ff_video_data(outputFrame_, outputWidth_, outputHeight_, FF2DTType(outputPixelFormat_)));
    
}