aliakseis / FFmpegPlayer

Simple FFmpeg video player
MIT License
151 stars 44 forks source link

Disable Volume Decode Issues #12

Open w136111526 opened 5 years ago

w136111526 commented 5 years ago

I want to disable audio decoding and restore it. Why not rewrite it at ParseThread? How do I rewrite your code to synchronize audio and video? The part I rewrote was:

auto guard = MakeGuard(&packet, av_packet_unref);
auto seekLambda = [this]
{
    return m_seekDuration != AV_NOPTS_VALUE || m_videoResetDuration != AV_NOPTS_VALUE;
};

if (seekLambda())
{
    return; // guard frees packet
}

if (packet.stream_index == m_videoStreamNumber)
{ 
    if (!m_videoPacketsQueue.push(packet, seekLambda))
    {
        return; // guard frees packet
    }
}
else if (packet.stream_index == m_audioStreamNumber)
{
    if (m_bNeedVolume)
    {
        if (!m_audioPacketsQueue.push(packet, seekLambda))
        {
            return; // guard frees packet
        }
    }
    else
        av_packet_unref(&packet);
}
else
{
    return; // guard frees packet
}
aliakseis commented 5 years ago

I see one small issue with it: avcodec_close() and setupAudioCodec() calls would be needed after missing data to reset audio decoder context. Most probably it should be done accordingly by the audio parser runnable thread.

w136111526 commented 5 years ago

I 'll try it out later. I have another question. Can you make this video hard decoded? Can you get it to support DPI adaptation? Does it match a high resolution monitor, like 3000 X 2000. Is not supporting the current code.

aliakseis commented 5 years ago

Could you please elaborate on this? As far as I see, both setup and display code invoke DPI scaling in the same way, so that there is no overflow.

w136111526 commented 5 years ago

My computer is Win10 device hard decoded as dxva2, I would like to ask if you can create IDrect3D9_Creative Design when specifying different adapterID to support different resolutions. At present, I think your code is using adapter = 0. Here is the relevant code:

ctx->d3d9 = createD3D(D3D_SDK_VERSION); if (!ctx->d3d9) { av_log(NULL, loglevel, "Failed to create IDirect3D object\n"); goto fail; }

    if (ist->hwaccel_device) {
        adapter = atoi(ist->hwaccel_device);
        av_log(NULL, AV_LOG_INFO, "Using HWAccel device %d\n", adapter);
    }

    IDirect3D9_GetAdapterDisplayMode(ctx->d3d9, adapter, &d3ddm);
    d3dpp.Windowed = TRUE;
    d3dpp.BackBufferWidth = GetSystemMetrics(SM_CXSCREEN);
    d3dpp.BackBufferHeight = GetSystemMetrics(SM_CYSCREEN);
    d3dpp.BackBufferCount = 1;
    d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;// d3ddm.Format;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.Flags = D3DPRESENTFLAG_VIDEO;

    d3dpp.Windowed = TRUE;
    d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
    d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;

    hr = IDirect3D9_CreateDevice(ctx->d3d9, adapter, D3DDEVTYPE_HAL, GetDesktopWindow(),
        D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED | D3DCREATE_FPU_PRESERVE,
        &d3dpp, &ctx->d3d9device);
    if (FAILED(hr)) {
        av_log(NULL, loglevel, "Failed to create Direct3D device\n");
        goto fail;
    }
aliakseis commented 5 years ago

I've done some basic adapter selection implementation. Sorry, not sure how to do it optimally since I don't have any problems with default adapter in my environments.

w136111526 commented 5 years ago

Hello, please ask why the CPlayerView class does not use thread lock CSingleLock lock(&m_csSurface, TRUE); What are the consequences of m_csSurface, TRUE)?

aliakseis commented 5 years ago

CSingleLock lock(&m_csSurface, TRUE) (with TRUE flag) works similarly to the lock_guard: https://en.cppreference.com/w/cpp/thread/lock_guard It protects parts that are critical from the mltithreaded access point of view. Let me know if you have any questions.