Skip to content

Commit f3b24c2

Browse files
committed
Opus Audio packet level statistics
Move the logic for calculating opus audio statistics from the standalone OpusStatistics class, into OpusAudioData. Based on work from Gagravarr#14 from @andrm
1 parent a8a3a07 commit f3b24c2

File tree

2 files changed

+61
-43
lines changed

2 files changed

+61
-43
lines changed

core/src/main/java/org/gagravarr/opus/OpusAudioData.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
* Raw, compressed audio data
2121
*/
2222
public class OpusAudioData extends OggStreamAudioData implements OpusPacket {
23+
private int numFrames = -1;
24+
private int numSamples = -1;
25+
2326
public OpusAudioData(OggPacket pkt) {
2427
super(pkt);
2528
}
@@ -30,4 +33,56 @@ public OpusAudioData(byte[] data) {
3033
protected boolean isEndOfStream() {
3134
return getOggPacket().isEndOfStream();
3235
}
36+
37+
public int getNumberOfFrames() {
38+
if (numFrames == -1) {
39+
calculateStructure();
40+
}
41+
return numFrames;
42+
}
43+
public int getNumberOfSamples() {
44+
if (numSamples == -1) {
45+
calculateStructure();
46+
}
47+
return numSamples;
48+
}
49+
50+
private void calculateStructure() {
51+
byte[] d = getData();
52+
numFrames = packet_get_nb_frames(d);
53+
numSamples = numFrames * packet_get_samples_per_frame(d, 48000);
54+
}
55+
56+
private static int packet_get_samples_per_frame(byte[] data, int fs) {
57+
int audiosize;
58+
if ((data[0]&0x80) != 0) {
59+
audiosize = ((data[0]>>3)&0x3);
60+
audiosize = (fs<<audiosize)/400;
61+
} else if ((data[0]&0x60) == 0x60) {
62+
audiosize = ((data[0]&0x08) != 0) ? fs/50 : fs/100;
63+
} else {
64+
audiosize = ((data[0]>>3)&0x3);
65+
if (audiosize == 3)
66+
audiosize = fs*60/1000;
67+
else
68+
audiosize = (fs<<audiosize)/100;
69+
}
70+
return audiosize;
71+
}
72+
73+
private static int packet_get_nb_frames(byte[] packet) {
74+
int count = 0;
75+
if (packet.length < 1) {
76+
return -1;
77+
}
78+
count = packet[0]&0x3;
79+
if (count==0)
80+
return 1;
81+
else if (count!=3)
82+
return 2;
83+
else if (packet.length<2)
84+
return -4;
85+
else
86+
return packet[1]&0x3F;
87+
}
3388
}

core/src/main/java/org/gagravarr/opus/OpusStatistics.java

Lines changed: 6 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -141,59 +141,22 @@ else if (getAudioPacketsCount() == 0) {
141141
return;
142142
}
143143

144-
int spp = packet_get_nb_frames(d);
145-
spp *= packet_get_samples_per_frame(d, 48000);
146-
if(spp<120 || spp>5760 || (spp%120)!=0) {
144+
int samples = audioData.getNumberOfSamples();
145+
if (samples<120 || samples>5760 || (samples%120) != 0) {
147146
System.err.println("WARNING: Invalid packet TOC in stream with sid "+sid);
148147
return;
149148
}
150-
total_samples += spp;
151-
page_samples += spp;
149+
total_samples += samples;
150+
page_samples += samples;
152151
total_packets++;
153152
//last_packet_duration = spp;
154-
if (max_packet_duration<spp) max_packet_duration=spp;
155-
if (min_packet_duration>spp) min_packet_duration = spp;
153+
if (max_packet_duration<samples) max_packet_duration = samples;
154+
if (min_packet_duration>samples) min_packet_duration = samples;
156155
if (max_packet_bytes<d.length) max_packet_bytes = d.length;
157156
if (min_packet_bytes>d.length) min_packet_bytes = d.length;
158157
}
159158

160159

161-
private static int packet_get_samples_per_frame(byte[] data, int Fs) {
162-
int audiosize;
163-
if ((data[0]&0x80) != 0)
164-
{
165-
audiosize = ((data[0]>>3)&0x3);
166-
audiosize = (Fs<<audiosize)/400;
167-
} else if ((data[0]&0x60) == 0x60)
168-
{
169-
audiosize = ((data[0]&0x08) != 0) ? Fs/50 : Fs/100;
170-
} else {
171-
audiosize = ((data[0]>>3)&0x3);
172-
if (audiosize == 3)
173-
audiosize = Fs*60/1000;
174-
else
175-
audiosize = (Fs<<audiosize)/100;
176-
}
177-
return audiosize;
178-
179-
}
180-
181-
private static int packet_get_nb_frames(byte[] packet) {
182-
int count = 0;
183-
if (packet.length < 1) {
184-
return -1;
185-
}
186-
count = packet[0]&0x3;
187-
if (count==0)
188-
return 1;
189-
else if (count!=3)
190-
return 2;
191-
else if (packet.length<2)
192-
return -4;
193-
else
194-
return packet[1]&0x3F;
195-
}
196-
197160
public double getMaxPacketDuration() {
198161
return (max_packet_duration/48.0);
199162
}

0 commit comments

Comments
 (0)