Use NeverDestroyed instead of DEPRECATED_DEFINE_STATIC_LOCAL
[WebKit-https.git] / Source / WebCore / platform / mock / mediasource / MockBox.cpp
1 /*
2  * Copyright (C) 2013 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "config.h"
27 #include "MockBox.h"
28
29 #if ENABLE(MEDIA_SOURCE)
30
31 #include <runtime/ArrayBuffer.h>
32 #include <runtime/DataView.h>
33 #include <runtime/Int8Array.h>
34 #include <wtf/NeverDestroyed.h>
35 #include <wtf/text/StringBuilder.h>
36
37 namespace WebCore {
38
39 MockBox::MockBox(ArrayBuffer* data)
40 {
41     m_type = peekType(data);
42     m_length = peekLength(data);
43     ASSERT(m_length >= 8);
44 }
45
46 String MockBox::peekType(ArrayBuffer* data)
47 {
48     StringBuilder builder;
49     RefPtr<Int8Array> array = JSC::Int8Array::create(data, 0, 4);
50     for (int i = 0; i < 4; ++i)
51         builder.append(array->item(i));
52     return builder.toString();
53 }
54
55 size_t MockBox::peekLength(ArrayBuffer* data)
56 {
57     RefPtr<JSC::DataView> view = JSC::DataView::create(data, 0, data->byteLength());
58     return view->get<uint32_t>(4, true);
59 }
60
61 MockTrackBox::MockTrackBox(ArrayBuffer* data)
62     : MockBox(data)
63 {
64     ASSERT(m_length == 17);
65
66     RefPtr<JSC::DataView> view = JSC::DataView::create(data, 0, data->byteLength());
67     m_trackID = view->get<int32_t>(8, true);
68
69     StringBuilder builder;
70     RefPtr<Int8Array> array = JSC::Int8Array::create(data, 12, 4);
71     for (int i = 0; i < 4; ++i)
72         builder.append(array->item(i));
73     m_codec = builder.toString();
74
75     m_kind = static_cast<TrackKind>(view->get<uint8_t>(16, true));
76 }
77
78 const String& MockTrackBox::type()
79 {
80     static NeverDestroyed<String> trak(ASCIILiteral("trak"));
81     return trak;
82 }
83
84 MockInitializationBox::MockInitializationBox(ArrayBuffer* data)
85     : MockBox(data)
86 {
87     ASSERT(m_length >= 13);
88
89     RefPtr<JSC::DataView> view = JSC::DataView::create(data, 0, data->byteLength());
90     int32_t timeValue = view->get<int32_t>(8, true);
91     int32_t timeScale = view->get<int32_t>(12, true);
92     m_duration = MediaTime(timeValue, timeScale);
93     
94     size_t offset = 16;
95
96     while (offset < m_length) {
97         RefPtr<ArrayBuffer> subBuffer = data->slice(offset);
98         if (MockBox::peekType(subBuffer.get()) != MockTrackBox::type())
99             break;
100
101         MockTrackBox trackBox(subBuffer.get());
102         offset += trackBox.length();
103         m_tracks.append(trackBox);
104     }
105 }
106
107 const String& MockInitializationBox::type()
108 {
109     static NeverDestroyed<String> init(ASCIILiteral("init"));
110     return init;
111 }
112
113 MockSampleBox::MockSampleBox(ArrayBuffer* data)
114     : MockBox(data)
115 {
116     ASSERT(m_length == 30);
117
118     RefPtr<JSC::DataView> view = JSC::DataView::create(data, 0, data->byteLength());
119     int32_t timeScale = view->get<int32_t>(8, true);
120
121     int32_t timeValue = view->get<int32_t>(12, true);
122     m_presentationTimestamp = MediaTime(timeValue, timeScale);
123
124     timeValue = view->get<int32_t>(16, true);
125     m_decodeTimestamp = MediaTime(timeValue, timeScale);
126
127     timeValue = view->get<int32_t>(20, true);
128     m_duration = MediaTime(timeValue, timeScale);
129
130     m_trackID = view->get<int32_t>(24, true);
131     m_flags = view->get<uint8_t>(28, true);
132     m_generation = view->get<uint8_t>(29, true);
133 }
134
135 const String& MockSampleBox::type()
136 {
137     static NeverDestroyed<String> smpl(ASCIILiteral("smpl"));
138     return smpl;
139 }
140
141 }
142
143 #endif