Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions src/codec-info.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import { CodecInfo } from './codec-info';

describe('CodecInfo', () => {
describe('isH264Available', () => {
it('should return true when the H.264 codec is available', async () => {
expect.assertions(1);

Object.defineProperty(window, 'RTCPeerConnection', {
writable: true,
value: jest.fn().mockReturnValue({
createOffer: jest.fn().mockResolvedValue({
sdp: 'a=rtpmap:124 H264/90000',
}),
close: jest.fn(),
} as unknown as RTCPeerConnection),
});

await expect(CodecInfo.isH264Available()).resolves.toBe(true);
});

it('should return false when the H.264 codec is not available', async () => {
expect.assertions(1);

Object.defineProperty(window, 'RTCPeerConnection', {
writable: true,
value: jest.fn().mockReturnValue({
createOffer: jest.fn().mockResolvedValue({
sdp: 'a=rtpmap:36 rtx/90000',
}),
close: jest.fn(),
} as unknown as RTCPeerConnection),
});

await expect(CodecInfo.isH264Available()).resolves.toBe(false);
});
});

describe('isAV1Available', () => {
it('should return true when the AV1 codec is available', async () => {
expect.assertions(1);

Object.defineProperty(window, 'RTCPeerConnection', {
writable: true,
value: jest.fn().mockReturnValue({
createOffer: jest.fn().mockResolvedValue({
sdp: 'a=rtpmap:124 AV1/90000',
}),
close: jest.fn(),
} as unknown as RTCPeerConnection),
});

await expect(CodecInfo.isAV1Available()).resolves.toBe(true);
});

it('should return false when the AV1 codec is not available', async () => {
expect.assertions(1);

Object.defineProperty(window, 'RTCPeerConnection', {
writable: true,
value: jest.fn().mockReturnValue({
createOffer: jest.fn().mockResolvedValue({
sdp: 'a=rtpmap:36 rtx/90000',
}),
close: jest.fn(),
} as unknown as RTCPeerConnection),
});

await expect(CodecInfo.isAV1Available()).resolves.toBe(false);
});
});
});
54 changes: 54 additions & 0 deletions src/codec-info.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/**
* CodecInfo class to provide static methods for codec information.
*/
export class CodecInfo {
/**
* Notifies the user whether or not the H.264
* codec is present.
* @returns -boolean.
*/
static async isH264Available(): Promise<boolean> {
Comment thread
SomeBody16 marked this conversation as resolved.
Outdated
let hasCodec = false;

try {
const peerConnection = new window.RTCPeerConnection();
const offer = await peerConnection.createOffer({
offerToReceiveVideo: true,
});

if (offer?.sdp?.match(/^a=rtpmap:\d+\s+H264\/\d+/m)) {
hasCodec = true;
}
peerConnection.close();
} catch (error) {
return false;
}

return hasCodec;
}

/**
* Notifies the user whether or not the H.264
* codec is present.
* @returns -boolean.
*/
static async isAV1Available(): Promise<boolean> {
let hasCodec = false;

try {
const peerConnection = new window.RTCPeerConnection();
const offer = await peerConnection.createOffer({
offerToReceiveVideo: true,
});

if (offer?.sdp?.match(/^a=rtpmap:\d+\s+AV1\/\d+/m)) {
hasCodec = true;
}
peerConnection.close();
} catch (error) {
return false;
}

return hasCodec;
}
}
1 change: 1 addition & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export * from './browser-info';
export * from './codec-info';
export * from './cpu-info';
export * from './system-info';
export * from './web-capabilities';