diff --git a/codec_parameters.go b/codec_parameters.go index 70ea3fb..fc3c417 100644 --- a/codec_parameters.go +++ b/codec_parameters.go @@ -80,6 +80,10 @@ func (cp *CodecParameters) ColorSpace() ColorSpace { 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 { return ColorTransferCharacteristic(cp.c.color_trc) } diff --git a/codec_parameters_test.go b/codec_parameters_test.go index 88a76c4..e5a2358 100644 --- a/codec_parameters_test.go +++ b/codec_parameters_test.go @@ -74,6 +74,8 @@ func TestCodecParameters(t *testing.T) { require.Equal(t, CodecTag(2), cp6.CodecTag()) cp6.SetColorRange(ColorRangeJpeg) require.Equal(t, ColorRangeJpeg, cp6.ColorRange()) + cp6.SetColorSpace(ColorSpaceBt709) + require.Equal(t, ColorSpaceBt709, cp6.ColorSpace()) cp6.SetCodecType(MediaTypeAudio) require.Equal(t, MediaTypeAudio, cp6.CodecType()) cp6.SetFrameSize(1) diff --git a/color_range.go b/color_range.go index 17faec3..eae9825 100644 --- a/color_range.go +++ b/color_range.go @@ -1,5 +1,6 @@ package astiav +//#include //#include import "C" @@ -12,3 +13,7 @@ const ( ColorRangeJpeg = ColorRange(C.AVCOL_RANGE_JPEG) ColorRangeNb = ColorRange(C.AVCOL_RANGE_NB) ) + +func (r ColorRange) String() string { + return C.GoString(C.av_color_range_name(C.enum_AVColorRange(r))) +} diff --git a/color_range_test.go b/color_range_test.go new file mode 100644 index 0000000..c1905a4 --- /dev/null +++ b/color_range_test.go @@ -0,0 +1,11 @@ +package astiav + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestColorRange(t *testing.T) { + require.Equal(t, "tv", ColorRangeMpeg.String()) +} diff --git a/color_space.go b/color_space.go index 22d0b91..0fe3f45 100644 --- a/color_space.go +++ b/color_space.go @@ -1,5 +1,6 @@ package astiav +//#include //#include import "C" @@ -25,3 +26,7 @@ const ( ColorSpaceIctcp = ColorSpace(C.AVCOL_SPC_ICTCP) ColorSpaceNb = ColorSpace(C.AVCOL_SPC_NB) ) + +func (s ColorSpace) String() string { + return C.GoString(C.av_color_space_name(C.enum_AVColorSpace(s))) +} diff --git a/color_space_test.go b/color_space_test.go new file mode 100644 index 0000000..a74736a --- /dev/null +++ b/color_space_test.go @@ -0,0 +1,11 @@ +package astiav + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestColorSpace(t *testing.T) { + require.Equal(t, "bt709", ColorSpaceBt709.String()) +} diff --git a/filter_graph_test.go b/filter_graph_test.go index b16ac8d..14dceee 100644 --- a/filter_graph_test.go +++ b/filter_graph_test.go @@ -33,6 +33,8 @@ func TestFilterGraph(t *testing.T) { } type link struct { channelLayout ChannelLayout + colorRange ColorRange + colorSpace ColorSpace frameRate Rational height int mediaType MediaType @@ -55,13 +57,15 @@ func TestFilterGraph(t *testing.T) { for _, v := range []graph{ { buffersinkExpectedInput: link{ + colorRange: ColorRangeUnspecified, + colorSpace: ColorSpaceUnspecified, frameRate: NewRational(4, 1), - height: 4, + height: 8, mediaType: MediaTypeVideo, - pixelFormat: PixelFormatRgba, - sampleAspectRatio: NewRational(1, 4), + pixelFormat: PixelFormatYuv420P, + sampleAspectRatio: NewRational(2, 1), timeBase: NewRational(1, 4), - width: 2, + width: 4, }, buffersinkName: "buffersink", buffersrcName: "buffer", @@ -80,15 +84,15 @@ func TestFilterGraph(t *testing.T) { target: "scale", }, }, - content: "[input_1]scale=2x4,settb=1/4,fps=fps=4/1,format=pix_fmts=rgba,setsar=1/4", - 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", + content: "[input_1]scale=4x8,settb=1/4,fps=fps=4/1,format=pix_fmts=yuv420p,setsar=2/1", + 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{ { - "height": "2", - "pix_fmt": strconv.Itoa(int(PixelFormatYuv420P)), + "height": "4", + "pix_fmt": strconv.Itoa(int(PixelFormatRgba)), "sar": "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.sampleRate, g.SampleRate()) 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.pixelFormat, g.PixelFormat()) require.Equal(t, e.sampleAspectRatio, g.SampleAspectRatio()) diff --git a/filter_link.go b/filter_link.go index cf1e95c..a94929c 100644 --- a/filter_link.go +++ b/filter_link.go @@ -20,6 +20,14 @@ func (l *FilterLink) ChannelLayout() ChannelLayout { 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 { return newRationalFromC(l.c.frame_rate) } diff --git a/frame.go b/frame.go index 3fbec3c..649be50 100644 --- a/frame.go +++ b/frame.go @@ -57,6 +57,14 @@ func (f *Frame) SetColorRange(r ColorRange) { 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 { return newFrameData(newFrameDataFrame(f)) } diff --git a/frame_test.go b/frame_test.go index 464e9f4..8a942b9 100644 --- a/frame_test.go +++ b/frame_test.go @@ -25,6 +25,7 @@ func TestFrame(t *testing.T) { defer f2.Free() f2.SetChannelLayout(ChannelLayout21) f2.SetColorRange(ColorRangeJpeg) + f2.SetColorSpace(ColorSpaceBt709) f2.SetHeight(2) f2.SetKeyFrame(true) f2.SetNbSamples(4) @@ -39,6 +40,7 @@ func TestFrame(t *testing.T) { f2.SetWidth(10) require.True(t, f2.ChannelLayout().Equal(ChannelLayout21)) require.Equal(t, ColorRangeJpeg, f2.ColorRange()) + require.Equal(t, ColorSpaceBt709, f2.ColorSpace()) require.Equal(t, 2, f2.Height()) require.True(t, f2.KeyFrame()) require.Equal(t, 4, f2.NbSamples())