Skip to content

Commit eda0265

Browse files
committed
修改片段着色器代码生成;
1 parent 67e7cfe commit eda0265

23 files changed

+356
-204
lines changed

README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,19 @@
6363
void mp_get_csp_matrix(struct mp_csp_params *params, struct mp_cmat *m);
6464
```
6565

66+
4. HDR metadata获取
67+
68+
```cpp
69+
AVFrameSideData *mdm = av_frame_get_side_data(src, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA);
70+
AVFrameSideData *clm = av_frame_get_side_data(src, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL);
71+
AVFrameSideData *dhp = av_frame_get_side_data(src, AV_FRAME_DATA_DYNAMIC_HDR_PLUS);
72+
pl_map_hdr_metadata(&dst->params.color.hdr, &(struct pl_av_hdr_metadata) {
73+
.mdm = (void *)(mdm ? mdm->data : NULL),
74+
.clm = (void *)(clm ? clm->data : NULL),
75+
.dhp = (void *)(dhp ? dhp->data : NULL),
76+
});
77+
```
78+
6679
### OpenGL 渲染图像,怎么实现画质增强的效果?
6780

6881
### Ffmpeg(5.0)在解码字幕与4.4.3不太一样

examples/player/mainwindow.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ MainWindow::MainWindow(QWidget *parent)
218218
d_ptr->playlistView->installEventFilter(this);
219219
installEventFilter(this);
220220

221-
resize(1000, 650);
221+
resize(1100, 680);
222222
}
223223

224224
MainWindow::~MainWindow()

ffmpeg/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ set(PROJECT_SOURCES
3030
videorender/openglshader.hpp
3131
videorender/openglshaderprogram.cc
3232
videorender/openglshaderprogram.hpp
33+
videorender/shaderutils.cc
34+
videorender/shaderutils.hpp
3335
videorender/videopreviewwidget.cc
3436
videorender/videopreviewwidget.hpp
3537
videorender/videorender.cc

ffmpeg/videorender/openglrender.cc

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -182,15 +182,6 @@ void OpenglRender::initSubTexture()
182182
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
183183
}
184184

185-
void OpenglRender::setColorTrc()
186-
{
187-
auto *avFrame = d_ptr->framePtr->avFrame();
188-
switch (avFrame->color_trc) {
189-
case AVCOL_TRC_SMPTE2084: break;
190-
default: break;
191-
}
192-
}
193-
194185
auto OpenglRender::fitToScreen(const QSize &size) -> QMatrix4x4
195186
{
196187
auto factor_w = static_cast<qreal>(width()) / size.width();
@@ -216,13 +207,13 @@ void OpenglRender::cleanup()
216207
}
217208
}
218209

219-
void OpenglRender::resetShader(int format)
210+
void OpenglRender::resetShader(Frame *frame)
220211
{
221212
makeCurrent();
222213
cleanup();
223214
d_ptr->programPtr->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/shader/video.vert");
224215
OpenglShader shader;
225-
d_ptr->programPtr->addShaderFromSourceCode(QOpenGLShader::Fragment, shader.generate(format));
216+
d_ptr->programPtr->addShaderFromSourceCode(QOpenGLShader::Fragment, shader.generate(frame));
226217
glBindVertexArray(d_ptr->vao);
227218
d_ptr->programPtr->link();
228219
d_ptr->programPtr->bind();
@@ -239,7 +230,7 @@ void OpenglRender::onUpdateFrame(const QSharedPointer<Frame> &framePtr)
239230
{
240231
if (d_ptr->framePtr.isNull()
241232
|| d_ptr->framePtr->avFrame()->format != framePtr->avFrame()->format) {
242-
resetShader(framePtr->avFrame()->format);
233+
resetShader(framePtr.data());
243234
d_ptr->frameChanged = true;
244235
} else if (d_ptr->framePtr->avFrame()->width != framePtr->avFrame()->width
245236
|| d_ptr->framePtr->avFrame()->height != framePtr->avFrame()->height) {
@@ -295,7 +286,6 @@ void OpenglRender::paintVideoFrame()
295286
auto param = Ffmpeg::ColorSpace::getYuvToRgbParam(d_ptr->framePtr.data());
296287
d_ptr->programPtr->setUniformValue("offset", param.offset);
297288
d_ptr->programPtr->setUniformValue("colorConversion", param.matrix);
298-
setColorTrc();
299289
draw();
300290
d_ptr->programPtr->release();
301291
d_ptr->frameChanged = false;

ffmpeg/videorender/openglrender.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,13 @@ class FFMPEG_EXPORT OpenglRender : public VideoRender,
4141
void initSubTexture();
4242
auto fitToScreen(const QSize &size) -> QMatrix4x4;
4343
void cleanup();
44-
void resetShader(int format);
44+
void resetShader(Frame *frame);
4545

4646
void onUpdateFrame(const QSharedPointer<Frame> &framePtr);
4747
void onUpdateSubTitleFrame(const QSharedPointer<Subtitle> &framePtr);
4848

4949
void paintVideoFrame();
5050
void paintSubTitleFrame();
51-
void setColorTrc();
5251

5352
void updateYUV420P();
5453
void updateYUYV422();

ffmpeg/videorender/openglshader.cc

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1+
// Most of this code comes from mpv
2+
13
#include "openglshader.hpp"
4+
#include "shaderutils.hpp"
25

6+
#include <ffmpeg/frame.hpp>
37
#include <utils/utils.h>
48

59
#include <QFile>
610

711
extern "C" {
8-
#include <libavutil/pixfmt.h>
12+
#include <libavutil/frame.h>
913
}
1014

1115
namespace Ffmpeg {
@@ -27,35 +31,28 @@ OpenglShader::OpenglShader(QObject *parent)
2731

2832
OpenglShader::~OpenglShader() = default;
2933

30-
QByteArray OpenglShader::generate(int format)
34+
auto OpenglShader::generate(Frame *frame) -> QByteArray
3135
{
36+
auto *avFrame = frame->avFrame();
37+
auto format = avFrame->format;
3238
qInfo() << "Generate Shader:" << format;
33-
auto frag = Utils::readAllFile(":/shader/video_header.frag");
34-
frag.append("\n");
35-
frag.append(Utils::readAllFile(":/shader/video_color.frag"));
36-
frag.append("\n");
37-
switch (format) {
38-
case AV_PIX_FMT_YUV420P:
39-
case AV_PIX_FMT_YUV422P:
40-
case AV_PIX_FMT_YUV444P:
41-
case AV_PIX_FMT_YUV410P:
42-
case AV_PIX_FMT_YUV411P: frag.append(Utils::readAllFile(":/shader/video_yuv420p.frag")); break;
43-
case AV_PIX_FMT_YUYV422: frag.append(Utils::readAllFile(":/shader/video_yuyv422.frag")); break;
44-
case AV_PIX_FMT_RGB24:
45-
case AV_PIX_FMT_BGR8:
46-
case AV_PIX_FMT_RGB8: frag.append(Utils::readAllFile(":/shader/video_rgb24.frag")); break;
47-
case AV_PIX_FMT_BGR24: frag.append(Utils::readAllFile(":/shader/video_bgr24.frag")); break;
48-
case AV_PIX_FMT_UYVY422: frag.append(Utils::readAllFile(":/shader/video_uyvy422.frag")); break;
49-
case AV_PIX_FMT_NV12:
50-
case AV_PIX_FMT_P010LE: frag.append(Utils::readAllFile(":/shader/video_nv12.frag")); break;
51-
case AV_PIX_FMT_NV21: frag.append(Utils::readAllFile(":/shader/video_nv21.frag")); break;
52-
case AV_PIX_FMT_ARGB: frag.append(Utils::readAllFile(":/shader/video_argb.frag")); break;
53-
case AV_PIX_FMT_RGBA: frag.append(Utils::readAllFile(":/shader/video_rgba.frag")); break;
54-
case AV_PIX_FMT_ABGR: frag.append(Utils::readAllFile(":/shader/video_abgr.frag")); break;
55-
case AV_PIX_FMT_BGRA: frag.append(Utils::readAllFile(":/shader/video_bgra.frag")); break;
56-
default: qWarning() << "UnSupported format:" << format; break;
39+
auto frag = ShaderUtils::header();
40+
if (!ShaderUtils::beginFragment(frag, format)) {
41+
return {};
5742
}
58-
frag.append("\n");
43+
ShaderUtils::passLinearize(frag, avFrame->color_trc);
44+
45+
auto temp = QString("color.rgb *= vec3(%1);\n").arg(ShaderUtils::trcNomPeak(avFrame->color_trc));
46+
frag.append(temp.toUtf8());
47+
48+
// HDR
49+
// ShaderUtils::toneMap(frag, avFrame);
50+
51+
auto color_trc = ShaderUtils::trcIsHdr(avFrame->color_trc) ? AVCOL_TRC_GAMMA22
52+
: avFrame->color_trc;
53+
ShaderUtils::passDeLinearize(frag, color_trc);
54+
ShaderUtils::finishFragment(frag);
55+
ShaderUtils::printShader(frag);
5956
return frag;
6057
}
6158

ffmpeg/videorender/openglshader.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@
55

66
namespace Ffmpeg {
77

8+
class Frame;
89
class OpenglShader : public QObject
910
{
1011
public:
1112
explicit OpenglShader(QObject *parent = nullptr);
1213
~OpenglShader() override;
1314

14-
auto generate(int format) -> QByteArray;
15+
auto generate(Frame *frame) -> QByteArray;
1516

1617
private:
1718
class OpenglShaderPrivate;

ffmpeg/videorender/shader/video_abgr.frag

Lines changed: 0 additions & 10 deletions
This file was deleted.

ffmpeg/videorender/shader/video_argb.frag

Lines changed: 0 additions & 10 deletions
This file was deleted.

ffmpeg/videorender/shader/video_bgr24.frag

Lines changed: 0 additions & 11 deletions
This file was deleted.

ffmpeg/videorender/shader/video_bgra.frag

Lines changed: 0 additions & 10 deletions
This file was deleted.
Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,9 @@
1-
void main()
2-
{
3-
vec3 yuv;
4-
vec4 color = vec4(0.0, 0.0, 0.0, 1.0);
51

6-
yuv.x = texture(tex_y, TexCord).r;
7-
yuv.yz = texture(tex_u, TexCord).rg;
2+
vec3 yuv;
3+
vec4 color = vec4(0.0, 0.0, 0.0, 1.0);
84

9-
yuv += offset;
10-
color.rgb = yuv * colorConversion;
5+
yuv.x = texture(tex_y, TexCord).r;
6+
yuv.yz = texture(tex_u, TexCord).rg;
117

12-
color.rgb = adjustContrast(color.rgb, contrast);
13-
color.rgb = adjustSaturation(color.rgb, saturation);
14-
color.rgb = adjustBrightness(color.rgb, brightness);
15-
16-
FragColor = color;
17-
}
8+
yuv += offset;
9+
color.rgb = yuv * colorConversion;
Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,9 @@
1-
void main()
2-
{
3-
vec3 yuv;
4-
vec4 color = vec4(0.0, 0.0, 0.0, 1.0);
51

6-
yuv.x = texture(tex_y, TexCord).r;
7-
yuv.yz = texture(tex_u, TexCord).gr;
2+
vec3 yuv;
3+
vec4 color = vec4(0.0, 0.0, 0.0, 1.0);
84

9-
yuv += offset;
10-
color.rgb = yuv * colorConversion;
5+
yuv.x = texture(tex_y, TexCord).r;
6+
yuv.yz = texture(tex_u, TexCord).gr;
117

12-
color.rgb = adjustContrast(color.rgb, contrast);
13-
color.rgb = adjustSaturation(color.rgb, saturation);
14-
color.rgb = adjustBrightness(color.rgb, brightness);
15-
16-
FragColor = color;
17-
}
8+
yuv += offset;
9+
color.rgb = yuv * colorConversion;
Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,9 @@
1-
void main()
2-
{
3-
vec3 yuv;
4-
vec4 color = vec4(0.0, 0.0, 0.0, 1.0);
51

6-
yuv.x = texture(tex_y, TexCord).r;
7-
yuv.yz = texture(tex_u, TexCord).rg;
2+
vec3 yuv;
3+
vec4 color = vec4(0.0, 0.0, 0.0, 1.0);
84

9-
yuv += offset;
10-
color.rgb = yuv * colorConversion;
5+
yuv.x = texture(tex_y, TexCord).r;
6+
yuv.yz = texture(tex_u, TexCord).rg;
117

12-
color.rgb = adjustContrast(color.rgb, contrast);
13-
color.rgb = adjustSaturation(color.rgb, saturation);
14-
color.rgb = adjustBrightness(color.rgb, brightness);
15-
16-
FragColor = color;
17-
}
8+
yuv += offset;
9+
color.rgb = yuv * colorConversion;

ffmpeg/videorender/shader/video_rgb24.frag

Lines changed: 0 additions & 11 deletions
This file was deleted.

ffmpeg/videorender/shader/video_rgba.frag

Lines changed: 0 additions & 10 deletions
This file was deleted.
Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,17 @@
1-
void main()
2-
{
3-
vec3 yuv;
4-
vec4 color = vec4(0.0, 0.0, 0.0, 1.0);
51

6-
int width = textureSize(tex_y, 0).x * 2;
7-
float tex_x = TexCord.x;
8-
int pixel = int(floor(width * tex_x)) % 2;
9-
vec4 tc = texture(tex_y, TexCord).rgba;
10-
float cb = tc.r;
11-
float y1 = tc.g;
12-
float cr = tc.b;
13-
float y2 = tc.a;
14-
float y = (pixel == 1) ? y2 : y1;
15-
yuv = vec3(y, cb, cr);
2+
vec3 yuv;
3+
vec4 color = vec4(0.0, 0.0, 0.0, 1.0);
164

17-
yuv += offset;
18-
color.rgb = yuv * colorConversion;
5+
int width = textureSize(tex_y, 0).x * 2;
6+
float tex_x = TexCord.x;
7+
int pixel = int(floor(width * tex_x)) % 2;
8+
vec4 tc = texture(tex_y, TexCord).rgba;
9+
float cb = tc.r;
10+
float y1 = tc.g;
11+
float cr = tc.b;
12+
float y2 = tc.a;
13+
float y = (pixel == 1) ? y2 : y1;
14+
yuv = vec3(y, cb, cr);
1915

20-
color.rgb = adjustContrast(color.rgb, contrast);
21-
color.rgb = adjustSaturation(color.rgb, saturation);
22-
color.rgb = adjustBrightness(color.rgb, brightness);
23-
24-
FragColor = color;
25-
}
16+
yuv += offset;
17+
color.rgb = yuv * colorConversion;
Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,10 @@
1-
void main()
2-
{
3-
vec3 yuv;
4-
vec4 color = vec4(0.0, 0.0, 0.0, 1.0);
51

6-
yuv.x = texture(tex_y, TexCord).r;
7-
yuv.y = texture(tex_u, TexCord).r;
8-
yuv.z = texture(tex_v, TexCord).r;
2+
vec3 yuv;
3+
vec4 color = vec4(0.0, 0.0, 0.0, 1.0);
94

10-
yuv += offset;
11-
color.rgb = yuv * colorConversion;
5+
yuv.x = texture(tex_y, TexCord).r;
6+
yuv.y = texture(tex_u, TexCord).r;
7+
yuv.z = texture(tex_v, TexCord).r;
128

13-
color.rgb = adjustContrast(color.rgb, contrast);
14-
color.rgb = adjustSaturation(color.rgb, saturation);
15-
color.rgb = adjustBrightness(color.rgb, brightness);
16-
17-
FragColor = color;
18-
}
9+
yuv += offset;
10+
color.rgb = yuv * colorConversion;

0 commit comments

Comments
 (0)