Ticket #13186: 009_avstream_codec_plugins.patch

File 009_avstream_codec_plugins.patch, 9.6 KB (added by Peter Bennett, 3 years ago)

Patch 009 - AVStream::codec and related functions in Plugins

  • mythplugins/mytharchive/mytharchive/thumbfinder.cpp

    diff --git a/mythplugins/mytharchive/mytharchive/thumbfinder.cpp b/mythplugins/mytharchive/mytharchive/thumbfinder.cpp
    index 94c7db0..d302e5e 100644
    a b bool ThumbFinder::initAVCodec(const QString &inFile) 
    588588    for (uint i = 0; i < m_inputFC->nb_streams; i++)
    589589    {
    590590        AVStream *st = m_inputFC->streams[i];
    591         if (m_inputFC->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
     591        if (m_inputFC->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
    592592        {
    593593            m_startTime = -1;
    594594            if (m_inputFC->streams[i]->start_time != (int) AV_NOPTS_VALUE)
    bool ThumbFinder::initAVCodec(const QString &inFile) 
    601601            }
    602602
    603603            m_videostream = i;
    604             m_frameWidth = st->codec->width;
    605             m_frameHeight = st->codec->height;
     604            m_frameWidth = st->codecpar->width;
     605            m_frameHeight = st->codecpar->height;
    606606            if (st->r_frame_rate.den && st->r_frame_rate.num)
    607607                m_fps = av_q2d(st->r_frame_rate);
    608608            else
    bool ThumbFinder::initAVCodec(const QString &inFile) 
    618618    }
    619619
    620620    // get the codec context for the video stream
    621     m_codecCtx = m_inputFC->streams[m_videostream]->codec;
     621    m_codecCtx = gCodecMap->getCodecContext
     622        (m_inputFC->streams[m_videostream]);
    622623    m_codecCtx->debug_mv = 0;
    623624    m_codecCtx->debug = 0;
    624625    m_codecCtx->workaround_bugs = 1;
    void ThumbFinder::closeAVCodec() 
    887888        delete[] m_outputbuf;
    888889
    889890    // close the codec
    890     if (m_codecCtx)
    891         avcodec_close(m_codecCtx);
     891    gCodecMap->freeCodecContext
     892        (m_inputFC->streams[m_videostream]);
    892893
    893894    // close the video file
    894895    m_inputFC.Close();
  • mythplugins/mytharchive/mytharchivehelper/main.cpp

    diff --git a/mythplugins/mytharchive/mytharchivehelper/main.cpp b/mythplugins/mytharchive/mytharchivehelper/main.cpp
    index cb795d4..3148883 100644
    a b static int grabThumbnail(QString inFile, QString thumbList, QString outFile, int 
    15891589    for (uint i = 0; i < inputFC->nb_streams; i++)
    15901590    {
    15911591        AVStream *st = inputFC->streams[i];
    1592         if (inputFC->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
     1592        if (inputFC->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
    15931593        {
    15941594            videostream = i;
    1595             width = st->codec->width;
    1596             height = st->codec->height;
     1595            width = st->codecpar->width;
     1596            height = st->codecpar->height;
    15971597            if (st->r_frame_rate.den && st->r_frame_rate.num)
    15981598                fps = av_q2d(st->r_frame_rate);
    15991599            else
    static int grabThumbnail(QString inFile, QString thumbList, QString outFile, int 
    16091609    }
    16101610
    16111611    // get the codec context for the video stream
    1612     AVCodecContext *codecCtx = inputFC->streams[videostream]->codec;
     1612    AVCodecContext *codecCtx = gCodecMap->getCodecContext
     1613        (inputFC->streams[videostream]);
    16131614
    16141615    // get decoder for video stream
    16151616    AVCodec * codec = avcodec_find_decoder(codecCtx->codec_id);
    static int grabThumbnail(QString inFile, QString thumbList, QString outFile, int 
    16701671
    16711672                while (!frameFinished || !keyFrame)
    16721673                {
    1673                     av_free_packet(&pkt);
     1674                    av_packet_unref(&pkt);
    16741675                    int res = av_read_frame(inputFC, &pkt);
    16751676                    if (res < 0)
    16761677                        break;
    static int grabThumbnail(QString inFile, QString thumbList, QString outFile, int 
    17551756            }
    17561757        }
    17571758
    1758         av_free_packet(&pkt);
     1759        av_packet_unref(&pkt);
    17591760    }
    17601761
    17611762    if (outputbuf)
    17621763        delete[] outputbuf;
    17631764
    17641765    // close the codec
    1765     avcodec_close(codecCtx);
     1766    gCodecMap->freeCodecContext
     1767        (inputFC->streams[videostream]);
    17661768
    17671769    return 0;
    17681770}
    static int64_t getFrameCount(AVFormatContext *inputFC, int vid_id) 
    17821784        {
    17831785            count++;
    17841786        }
    1785         av_free_packet(&pkt);
     1787        av_packet_unref(&pkt);
    17861788    }
    17871789
    17881790    return count;
    static int getFileInfo(QString inFile, QString outFile, int lenMethod) 
    19501952    {
    19511953        AVStream *st = inputFC->streams[i];
    19521954        char buf[256];
     1955        AVCodecContext *avctx = gCodecMap->getCodecContext(st);
     1956        AVCodecParameters *par = st->codecpar;
    19531957
    1954         avcodec_string(buf, sizeof(buf), st->codec, false);
     1958        buf[0]=0;
     1959        if (avctx)
     1960            avcodec_string(buf, sizeof(buf), avctx, false);
    19551961
    1956         switch (inputFC->streams[i]->codec->codec_type)
     1962        switch (st->codecpar->codec_type)
    19571963        {
    19581964            case AVMEDIA_TYPE_VIDEO:
    19591965            {
    static int getFileInfo(QString inFile, QString outFile, int lenMethod) 
    19631969                stream.setAttribute("streamindex", i);
    19641970                stream.setAttribute("ffmpegindex", ffmpegIndex++);
    19651971                stream.setAttribute("codec", codec.trimmed());
    1966                 stream.setAttribute("width", st->codec->width);
    1967                 stream.setAttribute("height", st->codec->height);
    1968                 stream.setAttribute("bitrate", (qlonglong)st->codec->bit_rate);
     1972                stream.setAttribute("width", par->width);
     1973                stream.setAttribute("height", par->height);
     1974                stream.setAttribute("bitrate", (qlonglong)par->bit_rate);
    19691975
    19701976                float fps;
    19711977                if (st->r_frame_rate.den && st->r_frame_rate.num)
    static int getFileInfo(QString inFile, QString outFile, int lenMethod) 
    19751981
    19761982                stream.setAttribute("fps", fps);
    19771983
    1978                 if (st->codec->sample_aspect_ratio.den && st->codec->sample_aspect_ratio.num)
     1984                if (par->sample_aspect_ratio.den && par->sample_aspect_ratio.num)
    19791985                {
    1980                     float aspect_ratio = av_q2d(st->codec->sample_aspect_ratio);
     1986                    float aspect_ratio = av_q2d(par->sample_aspect_ratio);
    19811987                    if (QString(inputFC->iformat->name) != "nuv")
    1982                         aspect_ratio = ((float)st->codec->width / st->codec->height) * aspect_ratio;
     1988                        aspect_ratio = ((float)par->width
     1989                        / par->height) * aspect_ratio;
    19831990
    19841991                    stream.setAttribute("aspectratio", aspect_ratio);
    19851992                }
    static int getFileInfo(QString inFile, QString outFile, int lenMethod) 
    20982105                else
    20992106                    stream.setAttribute("codec", codec.trimmed());
    21002107
    2101                 stream.setAttribute("channels", st->codec->channels);
     2108                stream.setAttribute("channels", par->channels);
    21022109
    21032110                AVDictionaryEntry *metatag =
    21042111                    av_dict_get(st->metadata, "language", NULL, 0);
    static int getFileInfo(QString inFile, QString outFile, int lenMethod) 
    21092116
    21102117                stream.setAttribute("id", st->id);
    21112118
    2112                 stream.setAttribute("samplerate", st->codec->sample_rate);
    2113                 stream.setAttribute("bitrate", (qlonglong)st->codec->bit_rate);
     2119                stream.setAttribute("samplerate", par->sample_rate);
     2120                stream.setAttribute("bitrate", (qlonglong)par->bit_rate);
    21142121
    21152122                if (st->start_time != (int) AV_NOPTS_VALUE)
    21162123                {
    static int getFileInfo(QString inFile, QString outFile, int lenMethod) 
    21652172            default:
    21662173                LOG(VB_JOBQUEUE, LOG_ERR,
    21672174                    QString("Skipping unsupported codec %1 on stream %2")
    2168                         .arg(inputFC->streams[i]->codec->codec_type).arg(i));
     2175                        .arg(inputFC->streams[i]->codecpar->codec_type).arg(i));
    21692176                break;
    21702177        }
     2178        gCodecMap->freeCodecContext(st);
    21712179    }
    21722180
    21732181    // finally save the xml to the file
  • mythplugins/mythmusic/mythmusic/avfdecoder.cpp

    diff --git a/mythplugins/mythmusic/mythmusic/avfdecoder.cpp b/mythplugins/mythmusic/mythmusic/avfdecoder.cpp
    index c8edbf9..18bf2aa 100644
    a b  
    3131#include <audiooutpututil.h>
    3232#include <mythlogging.h>
    3333#include <decoderhandler.h>
     34#include <mythavutil.h>
    3435
    3536using namespace std;
    3637
    bool avfDecoder::initialize() 
    366367    }
    367368
    368369    // Store the audio codec of the stream
    369     m_audioDec = m_inputContext->getContext()->streams[selTrack]->codec;
     370    m_audioDec = gCodecMap->getCodecContext
     371        (m_inputContext->getContext()->streams[selTrack]);
    370372
    371373    // Store the input format of the context
    372374    m_inputFormat = m_inputContext->getContext()->iformat;
    void avfDecoder::deinit() 
    435437        for (uint i = 0; i < m_inputContext->getContext()->nb_streams; i++)
    436438        {
    437439            AVStream *st = m_inputContext->getContext()->streams[i];
    438             if (st->codec && st->codec->codec)
    439                 avcodec_close(st->codec);
     440            gCodecMap->freeCodecContext(st);
    440441        }
    441442    }
    442443
  • mythtv/libs/libmythtv/mythavutil.h

    diff --git a/mythtv/libs/libmythtv/mythavutil.h b/mythtv/libs/libmythtv/mythavutil.h
    index 3e16df0..1357fe2 100644
    a b private: 
    8686 * This is a singeton class - only 1 instance gets created.
    8787 */
    8888
    89 class MythCodecMap
     89class MTV_PUBLIC MythCodecMap
    9090{
    9191  public:
    9292    MythCodecMap();
    class MythCodecMap 
    103103};
    104104
    105105/// This global variable contains the MythCodecMap instance for the app
    106 extern MythCodecMap *gCodecMap;
     106extern MTV_PUBLIC MythCodecMap *gCodecMap;
    107107
    108108
    109109class MythAVCopyPrivate;