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

Side by Side Diff: chrome/test/functional/media_test_matrix.py

Issue 6673078: Initial checkin of media test matrix class, which will be used for media perf test later. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Modified based on CR comments. Created 9 years, 9 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 | Annotate | Revision Log
OLDNEW
(Empty)
1 #!/usr/bin/python
2
3 # Copyright (c) 2011 The Chromium Authors. All rights reserved.
4 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file.
6
7 import csv
8 import os
9 import random
10
11 NOT_AVAILABLE_STRING = 'not available'
12
13
14 class MediaTestMatrix:
15 """This class reads video test matrix file and stores them.
16
17 Video test matrix contains different video titles as column and different
18 video codec (such as "webm" as columns. The matrix entry contains video
19 specification such as "320x240 50 fps VP8 / no audio 1 MBit/s PSNR 36.70"
20 or "not available". It also provides methods to generate information based
21 on the client's needs. For example, "video" tag or "audio" tag is returned
22 based on what kinds of media it is. This matrix is for managing different
23 kinds of media files in media testing.
24
25 TODO(imasaki@chromium.org): remove the code duplication in Generate methods.
26 """
27 # Video extensions such as "webm".
28 __exts = []
29 # Video specification dictionary of list of video descriptions
30 # (the key is video title).
31 __specs = {}
32 # Video titles such as "bear".
33 __video_titles = []
34 # Tag dictionary (the key is extension).
35 __tags = {}
36
37 def ReadData(self, csv_file):
38 """Reads CSV file and stores in list specs and extensions.
39
40 CSV file should have the following format:
41 "ext","tag","title1","title2",....
42 "0.webm", "video","description1","descrption2", "not available"
43 (when it is not available).
44
45 Args:
46 csv_file : CSV file name contains video matrix information described
47 above.
48
49 Raises:
50 csv.Error if the number of columns is not the same as the number of
51 tiles.
52 """
53 # Clean up all data.
54 self.__exts = []
55 self.__specs = {}
56 self.__video_titles = []
57 self.__tags = {}
58 file = open(csv_file, 'rb')
59 reader = csv.reader(file)
60 for counter, row in enumerate(reader):
61 if counter == 0:
62 # First row is comment. So, skip it.
63 pass
64 elif counter == 1:
65 # Second row is for header (video titles).
66 for title in row[1:]:
67 self.__video_titles.append(title)
68 self.__specs[title] = []
69 else:
70 # Error checking is done here based on the number of titles
71 if len(self.__video_titles) != len(row) - 1:
72 print "Row %d should have %d columns but has %d columns" % (counter,
73 len(self.__video_titles), len(row))
74 raise csv.Error
75 # First column should contain extension.
76 self.__exts.append(row[0])
77 # Second column should contain tag (audio or video).
78 self.__tags[row[0]] = row[1]
79 for i in range(len(row) - 2):
80 self.__specs[self.__video_titles[i]].append(row[i + 2])
81 file.close()
82
83 def __GenerateMediaInfo(self, sub_type, name, media_test_matrix_home_url):
84 """Generate media information from matrix generated by CSV file.
85
86 Args:
87 sub_type: index of the extensions (rows in the CSV file).
88 name: the name of the video file (column name in the CSV file).
89 media_test_matrix_home_url: url of the matrix home that used
90 to generate link.
91
92 Returns:
93 a tuple of (info, url, link, tag, is_video, nickname).
94 info: description of the video (an entry in the matrix).
95 url: URL of the video or audio.
96 link: href tag for video or audio.
97 tag: a tag string can be used to display video or audio.
98 is_video: True if the file is video; False otherwise.
99 nickname: nickname of the video for presentation.
100 """
101 if name is 'none':
102 return
103 cur_video = name
104 # All videos are placed up to the rows (below 15th row).
dennis_jeffrey 2011/03/18 23:51:41 I think we can remove this comment now that videos
imasaki1 2011/03/19 01:00:38 Done.
105 is_video = self.__tags[self.__exts[sub_type]] == "video"
dennis_jeffrey 2011/03/18 23:51:41 Use single quotes for strings: 'video'
imasaki1 2011/03/19 01:00:38 Done.
106 file = os.path.join(cur_video, cur_video + self.__exts[sub_type])
107 # Specs were generated from CSV file in readFile().
108 info = self.__specs[cur_video][sub_type]
109 url = media_test_matrix_home_url + file
110 link = '<b><a href="%s">%s</a>&nbsp;&nbsp;%s</b>' % (url, file, info)
111 type = ['audio', 'video'][is_video]
112 tag_attr = 'id="v" controls autoplay playbackRate=1 loop valign=top'
113 tag = '<%s %s src="%s">' % (type, tag_attr, file)
114 nickname = cur_video + self.__exts[sub_type]
115 return (info, url, link, tag, is_video, nickname)
116
117 def GenerateRandomMediaInfo(self, number_of_tries=10,
118 video_matrix_home_url=''):
119 """Generate random video info that can be used for playing this media.
120
121 Args:
122 video_only: True if generate random video only.
123 media_test_matrix_home_url: url of the matrix home that used
124 to generate link.
125
126 Returns:
127 a list of a tuples (info, url, link, tag, is_video, nickname).
128 info: description of the video (an entry in the matrix).
129 url: URL of the video/audio.
130 link: href tag for video or audio.
131 tag: a tag string can be used to display video or audio.
132 is_video: True if the file is video; False otherwise.
133 nickname: nickname of the video for presentation.
134 """
135 # Try number_of_tries times to find available video/audio.
136 for i in range(number_of_tries):
137 sub_type = random.randint(0, len(self.__exts))
138 name = self.__video_titles[random.randint(0, len(self.__video_titles)-1)]
139 (info, url, link, tag, is_video, nickname) = (
140 self.__GenerateMediaInfo(sub_type, name, video_matrix_home_url))
141 if NOT_AVAILABLE_STRING not in info:
142 return (info, url, link, tag, is_video, nickname)
143 # Gives up after that (very small chance).
144 return None
145
146 def GenerateAllMediaInfos(self, video_only, media_matrix_home_url=''):
147 """Generate all video infos that can be used for playing this media.
148
149 Args:
150 video_only: True if generate random video only (not audio).
dennis_jeffrey 2011/03/18 23:51:41 Add a line here for the "media_matrix_home_url" ar
imasaki1 2011/03/19 01:00:38 Done.
151
152 Returns:
153 a list of a tuples (info, url, link, tag, is_video, nickname).
154 info: description of the video (an entry in the matrix).
155 url: URL of the video/audio.
156 link: href tag for video or audio.
157 tag: a tag string can be used to display video or audio.
158 is_video: True if the file is video; False otherwise.
159 nickname: nickname of the video for presentation (such as bear.webm).
160 """
161 video_infos = []
dennis_jeffrey 2011/03/18 23:51:41 Since it looks like this function processes both v
imasaki1 2011/03/19 01:00:38 Done.
162
163 for i in range(0, len(self.__video_titles)-1):
164 name = self.__video_titles[i]
165 for sub_type in range(len(self.__exts)):
166 (info, url, link, tag, is_video, nickname) = (
167 self.__GenerateMediaInfo(sub_type, name, media_matrix_home_url))
168 if ((NOT_AVAILABLE_STRING not in info) and
169 ((not video_only) or (video_only and is_video))):
170 video_infos.append([info, url, link, tag, is_video, nickname])
171 return video_infos
172
173 def GenerateAllMediaInfosInCompactForm(self, video_only,
174 media_matrix_home_url=''):
175 """Generate all media information in compact form.
176
177 Compact form contains only url, nickname and tag.
178
179 Args:
180 video_only: True if generate random video only.
dennis_jeffrey 2011/03/18 23:51:41 Need a line for the "media_matrix_home_url" arg.
imasaki1 2011/03/19 01:00:38 Done.
181
182 Returns:
183 a list of a tuples (url, nickname, tag).
184 url: URL of the video/audio.
185 nickname: nickname of the video/audio for presentation
186 (such as bear.webm).
187 tag: HTML5 tag for the video/audio.
188 """
189 video_infos = []
dennis_jeffrey 2011/03/18 23:51:41 Similar comment as line 161 above.
imasaki1 2011/03/19 01:00:38 Done.
190 for i in range(0, len(self.__video_titles)-1):
191 name = self.__video_titles[i]
192 for sub_type in range(len(self.__exts)):
193 (info, url, link, tag, is_video, nickname) = (
194 self.__GenerateMediaInfo(sub_type, name, media_matrix_home_url))
195 tag = ['audio', 'video'][is_video]
196 if ((not NOT_AVAILABLE_STRING in info) and
197 ((not video_only) or (video_only and is_video))):
198 video_infos.append([url, nickname, tag])
199 return video_infos
200
201 @staticmethod
202 def LookForMediaInfoInCompactFormByNickName(compact_list, target):
203 """Look for video by its nickname in the compact_list.
204
205 Args:
206 compact_list: a list generated by GenerateAllMediaInfosInCompactForm.
207 target: a target nickname string to look for.
208
209 Returns:
210 A tuple (info, url, link, tag, is_video, nickname) where nickname is
dennis_jeffrey 2011/03/18 23:51:41 Since this function only returns (url, nickname, t
imasaki1 2011/03/19 01:00:38 Done.
211 a target string.
212 url: URL of the video/audio.
213 tag: HTML5 tag for the video/audio.
214 nickname: nickname of the video/audio for presentation
dennis_jeffrey 2011/03/18 23:51:41 Swap the "nickname" and "tag" lines to match the o
imasaki1 2011/03/19 01:00:38 Done.
215 (such as bear.webm).
216 """
217 for url, nickname, tag in compact_list:
218 if target == nickname:
219 return (url, nickname, tag)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698