Class: MP4::Metadata::Memoize::Stbl::SampleToChunkCalculator

Inherits:
Object
  • Object
show all
Defined in:
lib/mp4/metadata/memoize/stbl/sample_to_chunk_calculator.rb

Instance Method Summary collapse

Constructor Details

#initialize(stsc_table, total_chunks_count) ⇒ SampleToChunkCalculator

Returns a new instance of SampleToChunkCalculator.



5
6
7
8
9
10
11
12
13
14
15
16
# File 'lib/mp4/metadata/memoize/stbl/sample_to_chunk_calculator.rb', line 5

def initialize(stsc_table, total_chunks_count)
  @stsc_table = stsc_table.dup
  @total_chunks_count = total_chunks_count

  @current_item = nil
  @next_item = nil
  @prev_item = nil
  @counter = 0
  @chunk_samples_counter = 0
  @buffer = []
  @intermediary_chunks_count = 0
end

Instance Method Details

#count_hidden(sample_number) ⇒ Object



18
19
20
21
22
23
24
25
26
27
# File 'lib/mp4/metadata/memoize/stbl/sample_to_chunk_calculator.rb', line 18

def count_hidden(sample_number)
  (@total_chunks_count - @counter).times do
    @counter += 1
    @chunk_samples_counter += @current_item[:samples_per_chunk]

    return @counter if sample_number <= @chunk_samples_counter
  end

  nil
end

#find_chunk_number(sample_number) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/mp4/metadata/memoize/stbl/sample_to_chunk_calculator.rb', line 41

def find_chunk_number(sample_number)
  return @counter if sample_number <= @chunk_samples_counter

  return count_hidden(sample_number) if @stsc_table.empty?

  return search_in_buffer(sample_number) unless @buffer.empty?

  @current_item = @stsc_table.shift
  @next_item = @stsc_table.first || { samples_per_chunk: @current_item[:samples_per_chunk], first_chunk: @total_chunks_count }

  chunks_between = [@next_item[:first_chunk] - @current_item[:first_chunk], 1].max
  @buffer = Array.new(chunks_between) { @current_item[:samples_per_chunk] }

  value_in_buffer = search_in_buffer(sample_number)

  return value_in_buffer unless value_in_buffer.nil?

  raise "Chunk not found for sample #{sample_number}"
end

#search_in_buffer(sample_number) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
# File 'lib/mp4/metadata/memoize/stbl/sample_to_chunk_calculator.rb', line 29

def search_in_buffer(sample_number)
  @buffer.each do |samples_per_chunk|
    @chunk_samples_counter += samples_per_chunk
    @counter += 1
    @buffer.shift

    return @counter if sample_number <= @chunk_samples_counter
  end

  nil
end