Module: MP4::Metadata::Memoize::Stbl::Codec

Defined in:
lib/mp4/metadata/memoize/stbl/codec.rb

Class Method Summary collapse

Class Method Details

.avc1(avc1_data) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/mp4/metadata/memoize/stbl/codec.rb', line 33

def avc1(avc1_data)
  avc_profile_indication = avc1_data.avcC.avc_profile_indication
  profile_compatibility = avc1_data.avcC.profile_compatibility
  avc_level_indication = avc1_data.avcC.avc_level_indication

  {
    par: calculate_aspect_ratio(avc1_data.width.to_i, avc1_data.height.to_i),
    sar: "#{avc1_data.pasp.h_spacing}:#{avc1_data.pasp.v_spacing}",
    codec: format("avc1.%02X%02X%02X", avc_profile_indication, profile_compatibility, avc_level_indication).downcase,
    max_bitrate: avc1_data.bitrate.max_bitrate.to_i,
    avg_bitrate: avc1_data.bitrate.avg_bitrate.to_i,
  }
end

.extract_codec(codec) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/mp4/metadata/memoize/stbl/codec.rb', line 17

def extract_codec(codec)
  case codec.codec_type
  when 'avc1'
    avc1_data = MP4::Binary::Avc1.read(codec.content)
    avc1(avc1_data)
  when 'mp4a'
    mp4a_data = MP4::Binary::Mp4a.read(codec.content)
    mp4a(mp4a_data)
  when 'hev1'
    hev1_data = MP4::Binary::Hev1.read(codec.content)
    hev1(hev1_data)
  else
    raise NotImplementedError, "Unable to memoize `#{codec.codec_type}' codec, track #{track_id}"
  end
end

.hev1(hev1_data) ⇒ Object



61
62
63
64
65
66
67
68
69
# File 'lib/mp4/metadata/memoize/stbl/codec.rb', line 61

def hev1(hev1_data)
  {
    par: calculate_aspect_ratio(hev1_data[:width].to_i, hev1_data[:height].to_i),
    sar: "#{hev1_data[:pasp].h_spacing}:#{hev1_data[:pasp].v_spacing}",
    codec: 'hev1',
    max_bitrate: hev1_data[:bitrate].max_bitrate.to_i,
    avg_bitrate: hev1_data[:bitrate].avg_bitrate.to_i,
  }
end

.memoize_codecs(codecs) ⇒ Object



13
14
15
# File 'lib/mp4/metadata/memoize/stbl/codec.rb', line 13

def memoize_codecs(codecs)
  codecs.map { extract_codec(_1) }
end

.mp4a(mp4a_data) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/mp4/metadata/memoize/stbl/codec.rb', line 47

def mp4a(mp4a_data)
  object_type_indication = mp4a_data.esds.es_descriptor.dec_config_desc.object_type_indication
  audio_object_type_byte = mp4a_data.esds.es_descriptor.dec_config_desc.dec_specific_info.info.bytes[0]
  audio_object_type = (audio_object_type_byte >> 3) & 0x1F

  {
    codec: format("mp4a.%02x.%d", object_type_indication, audio_object_type),
    channel_count: mp4a_data.channel_count,
    sample_rate: (mp4a_data.sample_rate >> 16).to_i,
    max_bitrate: mp4a_data.esds.es_descriptor.dec_config_desc.max_bitrate.to_i,
    avg_bitrate: mp4a_data.esds.es_descriptor.dec_config_desc.avg_bitrate.to_i,
  }
end

.parse(stsd_cache) ⇒ Object



7
8
9
10
11
# File 'lib/mp4/metadata/memoize/stbl/codec.rb', line 7

def parse(stsd_cache)
  stsd = MP4::Binary::StsdAtom.read(stsd_cache)

  memoize_codecs(stsd.codecs)
end