Skip to content

Commit 0e1659f

Browse files
authored
feat: Add Archive.quantizationParameter (#577)
1 parent 56833dd commit 0e1659f

File tree

3 files changed

+65
-3
lines changed

3 files changed

+65
-3
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ All notable changes to this project will be documented in this file.
33
This project adheres to [Semantic Versioning](http://semver.org/).
44

55
# [8.20.0] - 2025-03-19
6+
- Added `quantizationParameter` to Video Archive
67
- Fixed custom event type parsing and creation in Conversation API
78
- Added support for the following event types in Conversation API:
89
- `member:invited`

src/main/java/com/vonage/client/video/Archive.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public class Archive extends StreamComposition {
3131
private URI url;
3232
private ArchiveStatus status;
3333
private OutputMode outputMode;
34+
private Integer quantizationParameter;
3435

3536
protected Archive() {
3637
}
@@ -52,6 +53,14 @@ protected Archive(Builder builder) {
5253
if ((maxBitrate = builder.maxBitrate) != null && (maxBitrate < 100000 || maxBitrate > 6000000)) {
5354
throw new IllegalArgumentException("Maximum bitrate must be between 100000 and 6000000.");
5455
}
56+
if ((quantizationParameter = builder.quantizationParameter) != null) {
57+
if (maxBitrate != null) {
58+
throw new IllegalStateException("Quantization parameter is mutually exclusive with maxBitrate.");
59+
}
60+
if (quantizationParameter < 15 || quantizationParameter > 40) {
61+
throw new IllegalArgumentException("Quantization parameter must be between 15 and 40.");
62+
}
63+
}
5564
}
5665

5766
/**
@@ -149,6 +158,17 @@ public String getMultiArchiveTag() {
149158
return multiArchiveTag;
150159
}
151160

161+
/**
162+
* Returns the quantization parameter if set for the Archive.
163+
*
164+
* @return The quantization parameter, or {@code null} if not applicable.
165+
* @since 8.20.0
166+
*/
167+
@JsonProperty("quantizationParameter")
168+
public Integer getQuantizationParameter() {
169+
return quantizationParameter;
170+
}
171+
152172
/**
153173
* Creates an instance of this class from a JSON payload.
154174
*
@@ -179,6 +199,7 @@ public static Builder builder(String sessionId) {
179199
public static class Builder extends StreamComposition.Builder {
180200
private String name, multiArchiveTag;
181201
private OutputMode outputMode;
202+
private Integer quantizationParameter;
182203

183204
Builder(String sessionId) {
184205
this.sessionId = sessionId;
@@ -317,6 +338,21 @@ public Builder maxBitrate(int maxBitrate) {
317338
return this;
318339
}
319340

341+
/**
342+
* (OPTIONAL) Quantization Parameter (QP) is an optional video encoding value allowed for composed archiving,
343+
* smaller values generate higher quality and larger archives, larger values generate lower quality and smaller
344+
* archives, QP uses variable bitrate (VBR). This must be between 15 and 40.
345+
*
346+
* @param quantizationParameter The quantization parameter as an integer (minimum 15, maximum 40).
347+
*
348+
* @return This builder.
349+
* @since 8.20.0
350+
*/
351+
public Builder quantizationParameter(int quantizationParameter) {
352+
this.quantizationParameter = quantizationParameter;
353+
return this;
354+
}
355+
320356
/**
321357
* Builds the {@linkplain Archive} object with this builder's settings.
322358
*

src/test/java/com/vonage/client/video/ArchiveTest.java

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
*/
1616
package com.vonage.client.video;
1717

18-
import com.vonage.client.TestUtils;
18+
import static com.vonage.client.TestUtils.testJsonableBaseObject;
1919
import com.vonage.client.VonageResponseParseException;
2020
import static org.junit.jupiter.api.Assertions.*;
2121
import org.junit.jupiter.api.*;
@@ -38,7 +38,7 @@ public void testSerializeAllParams() {
3838
.streamMode(StreamMode.AUTO).layout(layout)
3939
.multiArchiveTag(multiArchiveTag).build();
4040

41-
TestUtils.testJsonableBaseObject(request);
41+
testJsonableBaseObject(request);
4242
String json = request.toJson();
4343
assertTrue(json.contains("\"name\":\""+name+"\""));
4444
assertTrue(json.contains("\"multiArchiveTag\":\""+multiArchiveTag+"\""));
@@ -52,6 +52,30 @@ public void testSerializeAllParams() {
5252
assertTrue(json.contains("\"maxBitrate\":"+maxBitrate));
5353
}
5454

55+
@Test
56+
public void testQuantizationParameter() {
57+
String sessionId = "flR1ZSBPY3QgMjkgMTI6MTM6MjMgUERUIDIwMTN";
58+
int qp = 19;
59+
Archive request = Archive.builder(sessionId).quantizationParameter(qp).build();
60+
testJsonableBaseObject(request);
61+
String json = request.toJson();
62+
assertTrue(json.contains("\"sessionId\":\""+sessionId+"\""));
63+
assertTrue(json.contains("\"quantizationParameter\":"+qp));
64+
assertThrows(IllegalStateException.class, () ->
65+
Archive.builder(sessionId).quantizationParameter(qp).maxBitrate(213450).build()
66+
);
67+
}
68+
69+
@Test
70+
public void testQuantizationParameterBounds() {
71+
var builder = Archive.builder("SESSION_ID");
72+
int min = 15, max = 40;
73+
assertThrows(IllegalArgumentException.class, () -> builder.quantizationParameter(min-1).build());
74+
assertEquals(min, builder.quantizationParameter(min).build().getQuantizationParameter());
75+
assertThrows(IllegalArgumentException.class, () -> builder.quantizationParameter(max+1).build());
76+
assertEquals(max, builder.quantizationParameter(max).build().getQuantizationParameter());
77+
}
78+
5579
@Test
5680
public void testSerializeCustomLayout() {
5781
String style = "stream.instructor {position: absolute; width: 100%; height:50%;}";
@@ -62,7 +86,7 @@ public void testSerializeCustomLayout() {
6286
.streamMode(StreamMode.MANUAL).layout(layout)
6387
.outputMode(OutputMode.COMPOSED).build();
6488

65-
TestUtils.testJsonableBaseObject(request);
89+
testJsonableBaseObject(request);
6690
String json = request.toJson();
6791
assertTrue(json.contains("\"outputMode\":\"composed\""));
6892
assertTrue(json.contains("\"streamMode\":\"manual\""));
@@ -130,5 +154,6 @@ public void testFromJsonEmpty() {
130154
assertNull(archive.getDurationSeconds());
131155
assertNull(archive.getCreatedAt());
132156
assertNull(archive.getCreatedAtMillis());
157+
assertNull(archive.getQuantizationParameter());
133158
}
134159
}

0 commit comments

Comments
 (0)