Added missing ColorSpace + ColorRange methods

This commit is contained in:
Quentin Renard
2024-09-19 18:13:05 +02:00
parent 96484ce883
commit 084f11b493
10 changed files with 71 additions and 9 deletions

View File

@@ -80,6 +80,10 @@ func (cp *CodecParameters) ColorSpace() ColorSpace {
return ColorSpace(cp.c.color_space) return ColorSpace(cp.c.color_space)
} }
func (cp *CodecParameters) SetColorSpace(s ColorSpace) {
cp.c.color_space = C.enum_AVColorSpace(s)
}
func (cp *CodecParameters) ColorTransferCharacteristic() ColorTransferCharacteristic { func (cp *CodecParameters) ColorTransferCharacteristic() ColorTransferCharacteristic {
return ColorTransferCharacteristic(cp.c.color_trc) return ColorTransferCharacteristic(cp.c.color_trc)
} }

View File

@@ -74,6 +74,8 @@ func TestCodecParameters(t *testing.T) {
require.Equal(t, CodecTag(2), cp6.CodecTag()) require.Equal(t, CodecTag(2), cp6.CodecTag())
cp6.SetColorRange(ColorRangeJpeg) cp6.SetColorRange(ColorRangeJpeg)
require.Equal(t, ColorRangeJpeg, cp6.ColorRange()) require.Equal(t, ColorRangeJpeg, cp6.ColorRange())
cp6.SetColorSpace(ColorSpaceBt709)
require.Equal(t, ColorSpaceBt709, cp6.ColorSpace())
cp6.SetCodecType(MediaTypeAudio) cp6.SetCodecType(MediaTypeAudio)
require.Equal(t, MediaTypeAudio, cp6.CodecType()) require.Equal(t, MediaTypeAudio, cp6.CodecType())
cp6.SetFrameSize(1) cp6.SetFrameSize(1)

View File

@@ -1,5 +1,6 @@
package astiav package astiav
//#include <libavutil/pixdesc.h>
//#include <libavutil/pixfmt.h> //#include <libavutil/pixfmt.h>
import "C" import "C"
@@ -12,3 +13,7 @@ const (
ColorRangeJpeg = ColorRange(C.AVCOL_RANGE_JPEG) ColorRangeJpeg = ColorRange(C.AVCOL_RANGE_JPEG)
ColorRangeNb = ColorRange(C.AVCOL_RANGE_NB) ColorRangeNb = ColorRange(C.AVCOL_RANGE_NB)
) )
func (r ColorRange) String() string {
return C.GoString(C.av_color_range_name(C.enum_AVColorRange(r)))
}

11
color_range_test.go Normal file
View File

@@ -0,0 +1,11 @@
package astiav
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestColorRange(t *testing.T) {
require.Equal(t, "tv", ColorRangeMpeg.String())
}

View File

@@ -1,5 +1,6 @@
package astiav package astiav
//#include <libavutil/pixdesc.h>
//#include <libavutil/pixfmt.h> //#include <libavutil/pixfmt.h>
import "C" import "C"
@@ -25,3 +26,7 @@ const (
ColorSpaceIctcp = ColorSpace(C.AVCOL_SPC_ICTCP) ColorSpaceIctcp = ColorSpace(C.AVCOL_SPC_ICTCP)
ColorSpaceNb = ColorSpace(C.AVCOL_SPC_NB) ColorSpaceNb = ColorSpace(C.AVCOL_SPC_NB)
) )
func (s ColorSpace) String() string {
return C.GoString(C.av_color_space_name(C.enum_AVColorSpace(s)))
}

11
color_space_test.go Normal file
View File

@@ -0,0 +1,11 @@
package astiav
import (
"testing"
"github.com/stretchr/testify/require"
)
func TestColorSpace(t *testing.T) {
require.Equal(t, "bt709", ColorSpaceBt709.String())
}

View File

@@ -33,6 +33,8 @@ func TestFilterGraph(t *testing.T) {
} }
type link struct { type link struct {
channelLayout ChannelLayout channelLayout ChannelLayout
colorRange ColorRange
colorSpace ColorSpace
frameRate Rational frameRate Rational
height int height int
mediaType MediaType mediaType MediaType
@@ -55,13 +57,15 @@ func TestFilterGraph(t *testing.T) {
for _, v := range []graph{ for _, v := range []graph{
{ {
buffersinkExpectedInput: link{ buffersinkExpectedInput: link{
colorRange: ColorRangeUnspecified,
colorSpace: ColorSpaceUnspecified,
frameRate: NewRational(4, 1), frameRate: NewRational(4, 1),
height: 4, height: 8,
mediaType: MediaTypeVideo, mediaType: MediaTypeVideo,
pixelFormat: PixelFormatRgba, pixelFormat: PixelFormatYuv420P,
sampleAspectRatio: NewRational(1, 4), sampleAspectRatio: NewRational(2, 1),
timeBase: NewRational(1, 4), timeBase: NewRational(1, 4),
width: 2, width: 4,
}, },
buffersinkName: "buffersink", buffersinkName: "buffersink",
buffersrcName: "buffer", buffersrcName: "buffer",
@@ -80,15 +84,15 @@ func TestFilterGraph(t *testing.T) {
target: "scale", target: "scale",
}, },
}, },
content: "[input_1]scale=2x4,settb=1/4,fps=fps=4/1,format=pix_fmts=rgba,setsar=1/4", content: "[input_1]scale=4x8,settb=1/4,fps=fps=4/1,format=pix_fmts=yuv420p,setsar=2/1",
s: " +--------------+\nParsed_setsar_4:default--[2x4 1:4 rgba]--default| filter_out |\n | (buffersink) |\n +--------------+\n\n+-------------+\n| filter_in_1 |default--[1x2 1:2 yuv420p]--Parsed_scale_0:default\n| (buffer) |\n+-------------+\n\n +----------------+\nfilter_in_1:default--[1x2 1:2 yuv420p]--default| Parsed_scale_0 |default--[2x4 1:2 rgba]--Parsed_settb_1:default\n | (scale) |\n +----------------+\n\n +----------------+\nParsed_scale_0:default--[2x4 1:2 rgba]--default| Parsed_settb_1 |default--[2x4 1:2 rgba]--Parsed_fps_2:default\n | (settb) |\n +----------------+\n\n +--------------+\nParsed_settb_1:default--[2x4 1:2 rgba]--default| Parsed_fps_2 |default--[2x4 1:2 rgba]--Parsed_format_3:default\n | (fps) |\n +--------------+\n\n +-----------------+\nParsed_fps_2:default--[2x4 1:2 rgba]--default| Parsed_format_3 |default--[2x4 1:2 rgba]--Parsed_setsar_4:default\n | (format) |\n +-----------------+\n\n +-----------------+\nParsed_format_3:default--[2x4 1:2 rgba]--default| Parsed_setsar_4 |default--[2x4 1:4 rgba]--filter_out:default\n | (setsar) |\n +-----------------+\n\n", s: " +--------------+\nParsed_setsar_4:default--[4x8 2:1 yuv420p]--default| filter_out |\n | (buffersink) |\n +--------------+\n\n+-------------+\n| filter_in_1 |default--[2x4 1:2 rgba]--Parsed_scale_0:default\n| (buffer) |\n+-------------+\n\n +----------------+\nfilter_in_1:default--[2x4 1:2 rgba]--default| Parsed_scale_0 |default--[4x8 1:2 yuv420p]--Parsed_settb_1:default\n | (scale) |\n +----------------+\n\n +----------------+\nParsed_scale_0:default--[4x8 1:2 yuv420p]--default| Parsed_settb_1 |default--[4x8 1:2 yuv420p]--Parsed_fps_2:default\n | (settb) |\n +----------------+\n\n +--------------+\nParsed_settb_1:default--[4x8 1:2 yuv420p]--default| Parsed_fps_2 |default--[4x8 1:2 yuv420p]--Parsed_format_3:default\n | (fps) |\n +--------------+\n\n +-----------------+\nParsed_fps_2:default--[4x8 1:2 yuv420p]--default| Parsed_format_3 |default--[4x8 1:2 yuv420p]--Parsed_setsar_4:default\n | (format) |\n +-----------------+\n\n +-----------------+\nParsed_format_3:default--[4x8 1:2 yuv420p]--default| Parsed_setsar_4 |default--[4x8 2:1 yuv420p]--filter_out:default\n | (setsar) |\n +-----------------+\n\n",
sources: []FilterArgs{ sources: []FilterArgs{
{ {
"height": "2", "height": "4",
"pix_fmt": strconv.Itoa(int(PixelFormatYuv420P)), "pix_fmt": strconv.Itoa(int(PixelFormatRgba)),
"sar": "1/2", "sar": "1/2",
"time_base": "1/2", "time_base": "1/2",
"width": "1", "width": "2",
}, },
}, },
}, },
@@ -174,6 +178,8 @@ func TestFilterGraph(t *testing.T) {
require.Equal(t, e.sampleFormat, g.SampleFormat()) require.Equal(t, e.sampleFormat, g.SampleFormat())
require.Equal(t, e.sampleRate, g.SampleRate()) require.Equal(t, e.sampleRate, g.SampleRate())
default: default:
require.Equal(t, e.colorRange, g.ColorRange())
require.Equal(t, e.colorSpace, g.ColorSpace())
require.Equal(t, e.height, g.Height()) require.Equal(t, e.height, g.Height())
require.Equal(t, e.pixelFormat, g.PixelFormat()) require.Equal(t, e.pixelFormat, g.PixelFormat())
require.Equal(t, e.sampleAspectRatio, g.SampleAspectRatio()) require.Equal(t, e.sampleAspectRatio, g.SampleAspectRatio())

View File

@@ -20,6 +20,14 @@ func (l *FilterLink) ChannelLayout() ChannelLayout {
return v return v
} }
func (l *FilterLink) ColorRange() ColorRange {
return ColorRange(l.c.color_range)
}
func (l *FilterLink) ColorSpace() ColorSpace {
return ColorSpace(l.c.colorspace)
}
func (l *FilterLink) FrameRate() Rational { func (l *FilterLink) FrameRate() Rational {
return newRationalFromC(l.c.frame_rate) return newRationalFromC(l.c.frame_rate)
} }

View File

@@ -57,6 +57,14 @@ func (f *Frame) SetColorRange(r ColorRange) {
f.c.color_range = C.enum_AVColorRange(r) f.c.color_range = C.enum_AVColorRange(r)
} }
func (f *Frame) ColorSpace() ColorSpace {
return ColorSpace(f.c.colorspace)
}
func (f *Frame) SetColorSpace(s ColorSpace) {
f.c.colorspace = C.enum_AVColorSpace(s)
}
func (f *Frame) Data() *FrameData { func (f *Frame) Data() *FrameData {
return newFrameData(newFrameDataFrame(f)) return newFrameData(newFrameDataFrame(f))
} }

View File

@@ -25,6 +25,7 @@ func TestFrame(t *testing.T) {
defer f2.Free() defer f2.Free()
f2.SetChannelLayout(ChannelLayout21) f2.SetChannelLayout(ChannelLayout21)
f2.SetColorRange(ColorRangeJpeg) f2.SetColorRange(ColorRangeJpeg)
f2.SetColorSpace(ColorSpaceBt709)
f2.SetHeight(2) f2.SetHeight(2)
f2.SetKeyFrame(true) f2.SetKeyFrame(true)
f2.SetNbSamples(4) f2.SetNbSamples(4)
@@ -39,6 +40,7 @@ func TestFrame(t *testing.T) {
f2.SetWidth(10) f2.SetWidth(10)
require.True(t, f2.ChannelLayout().Equal(ChannelLayout21)) require.True(t, f2.ChannelLayout().Equal(ChannelLayout21))
require.Equal(t, ColorRangeJpeg, f2.ColorRange()) require.Equal(t, ColorRangeJpeg, f2.ColorRange())
require.Equal(t, ColorSpaceBt709, f2.ColorSpace())
require.Equal(t, 2, f2.Height()) require.Equal(t, 2, f2.Height())
require.True(t, f2.KeyFrame()) require.True(t, f2.KeyFrame())
require.Equal(t, 4, f2.NbSamples()) require.Equal(t, 4, f2.NbSamples())