Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(286)

Side by Side Diff: media/mp4/avc.cc

Issue 10651006: Add Common Encryption support to BMFF, including subsample decryption. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Satisfy mac_rel buildbot Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/mp4/avc.h ('k') | media/mp4/avc_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/mp4/avc.h" 5 #include "media/mp4/avc.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <vector> 8 #include <vector>
9 9
10 #include "media/mp4/box_definitions.h" 10 #include "media/mp4/box_definitions.h"
(...skipping 14 matching lines...) Expand all
25 nal_size = (nal_size << 8) + (*buf)[pos+2]; 25 nal_size = (nal_size << 8) + (*buf)[pos+2];
26 nal_size = (nal_size << 8) + (*buf)[pos+3]; 26 nal_size = (nal_size << 8) + (*buf)[pos+3];
27 std::copy(kAnnexBStartCode, kAnnexBStartCode + kAnnexBStartCodeSize, 27 std::copy(kAnnexBStartCode, kAnnexBStartCode + kAnnexBStartCodeSize,
28 buf->begin() + pos); 28 buf->begin() + pos);
29 pos += kLengthSize + nal_size; 29 pos += kLengthSize + nal_size;
30 } 30 }
31 return pos == buf->size(); 31 return pos == buf->size();
32 } 32 }
33 33
34 // static 34 // static
35 bool AVC::ConvertToAnnexB(int length_size, std::vector<uint8>* buffer) { 35 bool AVC::ConvertFrameToAnnexB(int length_size, std::vector<uint8>* buffer) {
36 RCHECK(length_size == 1 || length_size == 2 || length_size == 4); 36 RCHECK(length_size == 1 || length_size == 2 || length_size == 4);
37 37
38 if (length_size == 4) 38 if (length_size == 4)
39 return ConvertAVCToAnnexBInPlaceForLengthSize4(buffer); 39 return ConvertAVCToAnnexBInPlaceForLengthSize4(buffer);
40 40
41 std::vector<uint8> temp; 41 std::vector<uint8> temp;
42 temp.swap(*buffer); 42 temp.swap(*buffer);
43 buffer->reserve(temp.size() + 32); 43 buffer->reserve(temp.size() + 32);
44 44
45 size_t pos = 0; 45 size_t pos = 0;
46 while (pos + length_size < temp.size()) { 46 while (pos + length_size < temp.size()) {
47 int nal_size = temp[pos]; 47 int nal_size = temp[pos];
48 if (length_size == 2) nal_size = (nal_size << 8) + temp[pos+1]; 48 if (length_size == 2) nal_size = (nal_size << 8) + temp[pos+1];
49 pos += length_size; 49 pos += length_size;
50 50
51 RCHECK(pos + nal_size <= temp.size()); 51 RCHECK(pos + nal_size <= temp.size());
52 buffer->insert(buffer->end(), kAnnexBStartCode, 52 buffer->insert(buffer->end(), kAnnexBStartCode,
53 kAnnexBStartCode + kAnnexBStartCodeSize); 53 kAnnexBStartCode + kAnnexBStartCodeSize);
54 buffer->insert(buffer->end(), temp.begin() + pos, 54 buffer->insert(buffer->end(), temp.begin() + pos,
55 temp.begin() + pos + nal_size); 55 temp.begin() + pos + nal_size);
56 pos += nal_size; 56 pos += nal_size;
57 } 57 }
58 return pos == temp.size(); 58 return pos == temp.size();
59 } 59 }
60 60
61 // static 61 // static
62 bool AVC::InsertParameterSets(const AVCDecoderConfigurationRecord& avc_config, 62 bool AVC::ConvertConfigToAnnexB(
63 std::vector<uint8>* buffer) { 63 const AVCDecoderConfigurationRecord& avc_config,
64 std::vector<uint8>* buffer) {
65 DCHECK(buffer->empty());
66 buffer->clear();
64 int total_size = 0; 67 int total_size = 0;
65 for (size_t i = 0; i < avc_config.sps_list.size(); i++) 68 for (size_t i = 0; i < avc_config.sps_list.size(); i++)
66 total_size += avc_config.sps_list[i].size() + kAnnexBStartCodeSize; 69 total_size += avc_config.sps_list[i].size() + kAnnexBStartCodeSize;
67 for (size_t i = 0; i < avc_config.pps_list.size(); i++) 70 for (size_t i = 0; i < avc_config.pps_list.size(); i++)
68 total_size += avc_config.pps_list[i].size() + kAnnexBStartCodeSize; 71 total_size += avc_config.pps_list[i].size() + kAnnexBStartCodeSize;
69 72 buffer->reserve(total_size);
70 std::vector<uint8> temp;
71 temp.reserve(total_size);
72 73
73 for (size_t i = 0; i < avc_config.sps_list.size(); i++) { 74 for (size_t i = 0; i < avc_config.sps_list.size(); i++) {
74 temp.insert(temp.end(), kAnnexBStartCode, 75 buffer->insert(buffer->end(), kAnnexBStartCode,
75 kAnnexBStartCode + kAnnexBStartCodeSize); 76 kAnnexBStartCode + kAnnexBStartCodeSize);
76 temp.insert(temp.end(), avc_config.sps_list[i].begin(), 77 buffer->insert(buffer->end(), avc_config.sps_list[i].begin(),
77 avc_config.sps_list[i].end()); 78 avc_config.sps_list[i].end());
78 } 79 }
79 80
80 for (size_t i = 0; i < avc_config.pps_list.size(); i++) { 81 for (size_t i = 0; i < avc_config.pps_list.size(); i++) {
81 temp.insert(temp.end(), kAnnexBStartCode, 82 buffer->insert(buffer->end(), kAnnexBStartCode,
82 kAnnexBStartCode + kAnnexBStartCodeSize); 83 kAnnexBStartCode + kAnnexBStartCodeSize);
83 temp.insert(temp.end(), avc_config.pps_list[i].begin(), 84 buffer->insert(buffer->end(), avc_config.pps_list[i].begin(),
84 avc_config.pps_list[i].end()); 85 avc_config.pps_list[i].end());
85 } 86 }
86
87 buffer->insert(buffer->begin(), temp.begin(), temp.end());
88 return true; 87 return true;
89 } 88 }
90 89
91 } // namespace mp4 90 } // namespace mp4
92 } // namespace media 91 } // namespace media
OLDNEW
« no previous file with comments | « media/mp4/avc.h ('k') | media/mp4/avc_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698